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