javascript
JavaScript中本地对象、内置对象和宿主对象
http://www.jianshu.com/p/a52e6e183427
http://blog.csdn.net/weiyastory/article/details/52837466
http://www.cnblogs.com/qigang/p/3520974.html
在ECMAScript中,所有對(duì)象并非同等創(chuàng)建的。
一般來(lái)說(shuō),可以創(chuàng)建并使用的對(duì)象有3種:本地對(duì)象、內(nèi)置對(duì)象和宿主對(duì)象。
1、本地對(duì)象
ECMA-262把本地對(duì)象(native object)定義為“獨(dú)立于宿主環(huán)境的ECMAScript實(shí)現(xiàn)提供的對(duì)象”。
何謂宿主環(huán)境? “宿主”,生物學(xué)上,一般是指寄生的生物體選擇的寄生體,如:火影里的“白”(哈哈哈)。此處的宿主環(huán)境,簡(jiǎn)單來(lái)說(shuō)就是用戶的機(jī)器環(huán)境,包括操作系統(tǒng)和瀏覽器。
本地對(duì)象包括如下內(nèi)容:Object、Function、String、Array、Boolean、Number、Date、 RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError。由此可知,本地對(duì)象是ECMA-2定義的類(引用類型)。
2、內(nèi)置對(duì)象
ECMA-262 把內(nèi)置對(duì)象(built-in object)定義為“由 ECMAScript 實(shí)現(xiàn)提供的、獨(dú)立于宿主環(huán)境的所有對(duì)象,在 ECMAScript 程序開始執(zhí)行時(shí)出現(xiàn)”。這意味著開發(fā)者不必明確實(shí)例化內(nèi)置對(duì)象,它已被實(shí)例化了。
同樣是“獨(dú)立于宿主環(huán)境”。根據(jù)定義我們似乎很難分清“內(nèi)置對(duì)象”與“本地對(duì)象”的區(qū)別。而ECMA-262 只定義了兩個(gè)內(nèi)置對(duì)象,即 Global 和 Math (它們也是本地對(duì)象,根據(jù)定義,每個(gè)內(nèi)置對(duì)象都是本地對(duì)象)。
如此就可以理解了。內(nèi)置對(duì)象是本地對(duì)象的一種。而其包含的兩種對(duì)象中,Math對(duì)象我們經(jīng)常用到,可這個(gè)Global對(duì)象是啥東西呢?
Global對(duì)象是ECMAScript中最特別的對(duì)象,因?yàn)閷?shí)際上它根本不存在,但大家要清楚,在ECMAScript中,不存在獨(dú)立的函數(shù),所有函數(shù)都必須是某個(gè)對(duì)象的方法。類似于isNaN()、parseInt()和parseFloat()方法等,看起來(lái)都是函數(shù),而實(shí)際上,它們都是Global對(duì)象的方法。而且Global對(duì)象的方法還不止這些。有關(guān)Global對(duì)象的具體方法和屬性,感興趣的同學(xué)可以看一下這里:JavaScript 全局對(duì)象參考手冊(cè)
3、宿主對(duì)象
宿主對(duì)象就是執(zhí)行JS腳本的環(huán)境提供的對(duì)象。對(duì)于嵌入到網(wǎng)頁(yè)中的JS來(lái)說(shuō),其宿主對(duì)象就是瀏覽器提供的對(duì)象,所以又稱為瀏覽器對(duì)象,如IE、Firefox等瀏覽器提供的對(duì)象。不同的瀏覽器提供的宿主對(duì)象可能不同,即使提供的對(duì)象相同,其實(shí)現(xiàn)方式也大相徑庭!這會(huì)帶來(lái)瀏覽器兼容問(wèn)題,增加開發(fā)難度。
瀏覽器對(duì)象有很多,如Window和Document等等。
?
1、Global對(duì)象 ???
Global(全局)對(duì)象是在ECMAScript中是一個(gè)特別的對(duì)象,因?yàn)?strong>這個(gè)對(duì)象是不存在的。在ECMAScript 中任何不屬于其他對(duì)象的方法和屬性都是這個(gè)對(duì)象的方法和屬性。所有事實(shí)上并不存在什么全局屬性和全局函數(shù),因?yàn)橐磺腥值暮瘮?shù)和屬性都是這個(gè)Global對(duì)象的方法和屬性。但是由于這個(gè)對(duì)象并不是真真存在的,并且ECMAScript也沒(méi)有定義怎樣定義和調(diào)用這個(gè)對(duì)象,故所有Global.屬性和Global.()都是無(wú)效的,但是在WEB瀏覽器中中把Global對(duì)象作為window對(duì)象的一部分實(shí)現(xiàn)了,故一切的所謂的全局屬性和方法都是window對(duì)象的方法和屬性。
?
2、URI編碼方法--Global對(duì)象的內(nèi)置方法 ? ?
URI編碼方法可以編碼連接,以便發(fā)送給瀏覽器,采用特殊的UTF-8編碼特殊的不認(rèn)識(shí)的字符,比如在瀏覽器的地址欄中有漢字的時(shí)候,IE顯示的結(jié)果就是編碼的,如果不編碼或者編碼瀏覽器不認(rèn)識(shí),就會(huì)顯示一個(gè)亂碼結(jié)果就是找不到連接中所要請(qǐng)求的頁(yè)面?
encodeURI(box):?對(duì)變量box進(jìn)行編碼,但是這個(gè)方法不能夠?qū)RI本身特殊字符編碼,比如 正斜杠,#,冒號(hào),問(wèn)號(hào)等不會(huì)編碼,但是會(huì)編碼漢字等 ??
encodeURIComponent(box):?完全編碼,它會(huì)將發(fā)現(xiàn)的URI中所有的非標(biāo)準(zhǔn)字符進(jìn)行編碼。因?yàn)榫幋a徹底,故使用的頻率要比不完全編碼(encodeURI())方法多很多。
?
3、URI解碼方法--Global對(duì)象的內(nèi)置方法????
通過(guò)上面兩種編碼方法進(jìn)行編碼的URI,可以通過(guò)解碼方法進(jìn)行解碼。然后還原可讀的URI ???
decodeURI():?用來(lái)解碼由編碼方法 encodeURI()編碼的URI ???
decodeURIComponent():?用來(lái)解碼由編碼方法 encodeURIComponent() 編碼的URI ???
解碼方法和編碼方法最好對(duì)應(yīng)的使用,用什么方法編碼,就用對(duì)應(yīng)的方法進(jìn)行解碼,否則可能會(huì)造成解碼不出來(lái)或者解碼不完整
4、eval 方法--Global對(duì)象內(nèi)置方法?
eval()方法是用來(lái)?yè)?dān)當(dāng)一個(gè)字符串解析器的作用,只是接收一個(gè)參數(shù),而這個(gè)參數(shù)中就是要執(zhí)行的JS代碼,多余的參數(shù)會(huì)忽略的,此方法可能有返回值也可能沒(méi)有,要根據(jù)參數(shù)中的JS代碼而定,在AJAX中傳遞參數(shù)的時(shí)候很有用。eval()的參數(shù)是一個(gè)字符串。如果字符串表示的是表達(dá)式,eval()會(huì)對(duì)表達(dá)式進(jìn)行求值。如果參數(shù)表示一個(gè)或多個(gè)JavaScript語(yǔ)句,?那么eval()就會(huì)執(zhí)行這些語(yǔ)句。注意不要用eval()來(lái)執(zhí)行一個(gè)四則運(yùn)算表達(dá)式;因?yàn)?JavaScript 會(huì)自動(dòng)為四則運(yùn)算求值并不需要用eval來(lái)包裹。
如果解析的字符串中的JS代碼是定義變量,比如說(shuō)數(shù)組對(duì)象,字符串等代碼,則會(huì)返回這些定義結(jié)果,并且還原真正的類型;如果是定義一個(gè)函數(shù)或者調(diào)用一個(gè)函數(shù),則沒(méi)有返回值
1 //eval() 方法用來(lái)解析字符串,只是接受一個(gè)參數(shù),這個(gè)參數(shù)中就是要執(zhí)行的JS代碼,在AJAX中用來(lái)傳遞參數(shù)很頻繁使用 2 var box='alert("wo shi zai zi fu chuan zhong di JS dai ma !!!")'; 3 alert(box); // alert("wo shi zai zi fu chuan zhong di JS dai ma !!!") 4 eval(box); // wo shi zai zi fu chuan zhong di JS dai ma !!! 5 6 var box='alert("abc")'; //注意要寫正確這里面的JS代碼 7 alert(box); //alert("abc") 8 alert(eval(box)); //先輸出:abc 這是eval解析字符串box的結(jié)果,然后輸出 undefined 說(shuō)明此時(shí)eval方法沒(méi)有返回值 9 10 //下面方法說(shuō)明,在eval方法解析某種字面量變量的時(shí)候,返回的就是這個(gè)字面量的值 11 var box="[3,4,5,6]"; 12 alert(box); // [3,4,5,6] 13 var res=eval(box); 14 alert(res); // 3,4,5,6 eval() 方法將解析的結(jié)果返回,是一個(gè)數(shù)組 15 16 var box='"234"'; 17 alert(typeof eval(box)); //string 18 alert(eval(box)); //234 View Code?如果字符串中定義有函數(shù),或者變量等,和正則表達(dá)式中的一些屬性一樣,需要先執(zhí)行以下,也就是說(shuō)先解析一下(eval(box));然后后面的語(yǔ)句中就可以調(diào)用這個(gè)字符串中定義的方法了 ? ? ?
1 //如果字符串中含有方法或者變量的時(shí)候,是需要先解析一次字符串,然后就可以調(diào)用和執(zhí)行字符串中的方法, 2 var box='var run=123;function sum(){return 123;}'; 3 //alert(sum()); // error: not undefiend 4 //alert(run); // error: not undefined 5 eval(box); //解析一次,就將box中最原始的JS代碼進(jìn)行了還原, 6 alert(sum()); // 123 上面通過(guò)eval方法解析了字符串 box 知道定義了一個(gè)方法名為sum 7 alert(run); //123 View Codeeval() 方法雖然很好用,功能很強(qiáng)大,但是也是很危險(xiǎn)的方法,因此在使用的時(shí)候應(yīng)該謹(jǐn)慎使用。特別是在用戶輸入數(shù)據(jù)的時(shí)候,很可能會(huì)導(dǎo)致程序的安全性問(wèn)題,比如代碼注入等等
5、Global 內(nèi)置的一些屬性 ???
有很多屬性,比如 undefined,Array,NaN,Object,Function 等,alert(Array);返回的就是數(shù)組類型Array的構(gòu)造函數(shù),也就是調(diào)用Array.constructor 時(shí)候的返回值
6、Math對(duì)象 ???
Math對(duì)象是ECMAScript為了保存數(shù)學(xué)公式和信息而提供的一個(gè)對(duì)象,這個(gè)對(duì)象中的屬性和方法的執(zhí)行效率要比我們直接在JS中編寫數(shù)學(xué)公式的效率高很多
7、Math對(duì)象的屬性 ???
Math對(duì)象的屬性都是在平時(shí)的計(jì)算中很多時(shí)候都會(huì)用到的一些特殊的值,注意大小寫?
| ? ? ? ? ? ? ? ? ? |
8、min()、max() 方法 ???
返回的是一組數(shù)中的最大值和最小值,前提是這一組數(shù)中必須全部能夠成功的通過(guò)隱試轉(zhuǎn)換成數(shù)值,也就是說(shuō)可以包含數(shù)值型字符串,但是不能夠包含非數(shù)值型字符串,否則會(huì)返回NaN。 ???
不能夠傳遞一個(gè)數(shù)組進(jìn)去,返回的也是NaN,只能這樣使用 Math.min(2,3,4,5,'7',1);
1 // min() max() 用來(lái)求一組數(shù)中的最大值和最小值 2 alert(Math.min(3,5,6,7,8,9)); //3 3 alert(Math.max(3,5,6,7,8,9)); //9 4 5 //數(shù)值行字符串自動(dòng)轉(zhuǎn)換 6 alert(Math.min('3',4,9,10,'5','6')); //3 7 alert(Math.max('3',4,9,'10',5,'6')); //10 8 9 //如果不能夠轉(zhuǎn)換其中的任何一個(gè)數(shù)字,返回的是NaN;轉(zhuǎn)換的時(shí)候應(yīng)該是調(diào)用的Number(x)方法進(jìn)行轉(zhuǎn)換的 10 alert(Math.min('abc',4,9,10,'5','6')); //NaN 11 alert(Math.max('abc',4,9,'10',5,'6')); //NaN 12 alert(Math.max(3,4,9,10,5,'6abc')); //NaN 13 14 //不支持傳遞一個(gè)數(shù)組進(jìn)去 15 var box=[2,3,4,5,6,7,8]; 16 alert(Math.min(box)); //NaN 17 alert(Math.max(box)); //NaN 18 //alert(box.min()); //不提供此方法 19 alert(box.min); //undefined View Code9、舍入方法????
Math.ceil(num):將num向上舍入到里這個(gè)數(shù)最近的一個(gè)整數(shù)。Math.ceil(5.1)==6為true ???
Math.floor(num):將num向下舍去,即它總是將數(shù)值向下舍入為最接近的整數(shù);取整 ???
Math.round(num):四舍五入方法, ???
這些方法同樣能夠接收數(shù)值型的字符串('5'),因?yàn)閮?nèi)部會(huì)隱試的調(diào)用Number()轉(zhuǎn)換方法,只是處理傳入進(jìn)去的第一個(gè)參數(shù),其余的參數(shù)會(huì)被忽略掉
1 // 舍入方法 ceil() floor() round() 只是接受一個(gè)參數(shù),多余的會(huì)忽略掉 2 //ceil() 方法 就是向上舍入,將小數(shù)點(diǎn)后面的數(shù)值向上舍入為最近的整數(shù) 3 alert(Math.ceil(5.9)); //6 4 alert(Math.ceil(5.5)); //6 5 alert(Math.ceil(5.1)); //6 6 alert(Math.ceil('5.1')); //6 自動(dòng)調(diào)用內(nèi)置的轉(zhuǎn)換方法Number()方法 7 alert(Math.ceil('5.1a')); //NaN 8 9 //floor() 方法,就是向下舍去,將小數(shù)點(diǎn)后面的數(shù)值向下舍為最近的整數(shù) 10 alert(Math.floor(5.9)); //5 11 alert(Math.floor(5.5)); //5 12 alert(Math.floor(5.1)); //5 13 alert(Math.floor('5.1')); //5 自動(dòng)調(diào)用內(nèi)置的轉(zhuǎn)換方法 Number()方法 14 alert(Math.floor('5.1a')); //NaN 15 16 // round() 方法,對(duì)參數(shù)進(jìn)行四舍五入 17 alert(Math.round(5.9)); //6 18 alert(Math.round(5.5)); //6 19 alert(Math.round(5.1)); //5 20 alert(Math.round('5.1')); //5 21 alert(Math.round('5.1a')); //NaN 22 23 alert(Math.round(5.4,6.7)); //5 View Code10、random 方法 ???
這個(gè)方法是產(chǎn)生一個(gè)0到1之間的隨機(jī)數(shù),但是不包括0和1,Math.random() 即可 ???
但是很多時(shí)候需要返回的是一個(gè)自定義的范圍的隨機(jī)數(shù),可以采用一個(gè)公式:Math.floor(Math.random()*總數(shù)+起始數(shù))。這個(gè)總數(shù),并不是范圍的結(jié)束數(shù),而是通過(guò)計(jì)算而得:總數(shù)=結(jié)束數(shù)-起始數(shù)+1。由于隨機(jī)數(shù)返回的是一個(gè)浮點(diǎn)數(shù),故還要通過(guò)向下取整來(lái)進(jìn)行舍入 ???
可以通過(guò)函數(shù)的方法可以進(jìn)行一個(gè)封裝,傳遞兩個(gè)參數(shù),起始數(shù)和結(jié)尾數(shù),返回一個(gè)符合此范圍的隨機(jī)數(shù): ?
1 // 隨機(jī)數(shù) random 方法 用來(lái)返回的是0到1之間的一個(gè)隨機(jī)數(shù) 2 var box=Math.random(); // 產(chǎn)生一個(gè)0到1之間的隨機(jī)數(shù) 3 alert(box); 4 5 //產(chǎn)生10個(gè)0到1之間的隨機(jī)數(shù),并且輸出到界面上 6 for(var i=0;i<10;i++){ 7 document.write(Math.random()); 8 document.write('<br />'); 9 } 10 11 //產(chǎn)生的是9到14之間的隨機(jī)數(shù) 本來(lái)是想產(chǎn)生5~10之間的整數(shù) 12 for(var i=0;i<10;i++){ 13 document.write(Math.random()*10+5); 14 document.write("<br />"); 15 } 16 17 //為了解決上面的問(wèn)題,可以采用公式:Math.random()*總數(shù)+起始數(shù); 其中 總數(shù)=結(jié)束數(shù)-起始數(shù)+1;原因不解釋 18 //接收兩個(gè)參數(shù),返回在這兩個(gè)參數(shù)之間的隨機(jī)整數(shù)。 19 function ran(start,end){ 20 var count=end-start+1; 21 return Math.floor(Math.random()*count+start);//產(chǎn)生一個(gè)符合區(qū)間的隨機(jī)數(shù),然后向下取整, 22 } 23 24 for(var i=0;i<10;i++){ 25 document.write(ran(5,10)); //產(chǎn)生5~10之間的一個(gè)隨機(jī)數(shù) 26 document.write("<br />"); 27 } View Code11、其它的數(shù)學(xué)方法 ?
| ? |
?
求正切的時(shí)候結(jié)果不是很精確:alert(Math.tan(Math.PI/4));?//0.99999999999
1 //其他的一些方法 2 alert(Math.abs(-3)); //3 取絕對(duì)值方法 3 alert(Math.exp(3)); //20.085536923187668 自然數(shù) e 的3次方,傳遞的參數(shù)可變的 4 5 alert(Math.LN10); //屬性,返回10的自然對(duì)數(shù) 6 //返回一個(gè)數(shù)的自然對(duì)數(shù),就是以 e 為底的自然對(duì)數(shù) 7 alert(Math.log(10)); 8 alert(Math.log(100)); 9 alert(Math.log(9)); 10 11 // Math.pow(num,power) 返回的是num數(shù)據(jù)的power次冪 12 alert(Math.pow(2,3)); //8 13 alert(Math.pow(4,2)); //16 14 15 // Math.sqrt(num) 返回?cái)?shù)據(jù) num 的平方根 16 //這兩個(gè)是屬性中的開平方根 17 alert(Math.SQRT2); 18 alert(Math.SQRT1_2); 19 //下面才是方法的使用 20 alert(Math.sqrt(9)); //3 21 alert(Math.sqrt(100)); //10 22 23 // 三角函數(shù) 是以弧度為單位 24 alert(Math.sin(90)); //0.8939966636005578 25 alert(Math.sin(Math.PI/2)); //1 26 alert(Math.cos(Math.PI/4)); //余弦 27 alert(Math.tan(Math.PI/4)); //0.99999999999 正切 28 29 //求反正切 Math.atan(x); 返回的也是弧度值 30 alert(Math.atan(1)); //0.7853981633974483 31 alert(Math.PI/4); //0.7853981633974483 32 //Math.atan2(x,y);返回的是x/y的反正切值 33 alert(Math.atan2(4,2)); //1.1071487177940904 34 alert(Math.atan(2)); //1.1071487177940904 35 36 //反余弦與反正弦 37 alert(Math.asin(1)); //1.5707963267948965 38 alert(Math.PI/2); //1.5707963267948965 39 alert(Math.acos(1)); //0 40 alert(Math.acos(-1)); //3.141592653589793 41 alert(Math.PI); //3.141592653589793 View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/mengyu22/p/7478258.html
總結(jié)
以上是生活随笔為你收集整理的JavaScript中本地对象、内置对象和宿主对象的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: hdu4027Can you answe
- 下一篇: JS 上传图片