javascript
JS 学习笔记--11---内置对象(Global/Math)
練習中使用的瀏覽器是IE10,如果各位朋友有不同意見或者遇到瀏覽器不兼容問題,希望指正?
1、內置對象的定義:有ECMAScript實現提供的、不依賴與宿主環境的對象,在ECMAScript運行之前就已經創建好的對象就叫做內置對象。就是說,是不需要我們開發人員先是的實例化對象就能夠調用和運行的對象。 在ECM-262中只是定義了兩個內置對象 Global和Math對象
?
2、Global對象 ???
Global(全局)對象是在ECMAScript中是一個特別的對象,因為這個對象是不存在的。在ECMAScript 中任何不屬于其他對象的方法和屬性都是這個對象的方法和屬性。所有事實上并不存在什么全局屬性和全局函數,因為一切全局的函數和屬性都是這個Global對象的方法和屬性。但是由于這個對象并不是真真存在的,并且ECMAScript也沒有定義怎樣定義和調用這個對象,故所有Global.屬性和Global.()都是無效的,但是在WEB瀏覽器中中把Global對象作為window對象的一部分實現了,故一切的所謂的全局屬性和方法都是window對象的方法和屬性。
1 //ECMAScript 中沒有定義怎么調用Global對象,故Global.屬性 或者Global.方法 都是無效的 2 //Web瀏覽器中將global作為window對象的一部分來加以實現 3 alert(window); //object Window 4 alert(Global); //error Global not undefined 5 6 var box='abc'; 7 alert(window.box); //abc 8 alert(Global.box); //error 9 10 function run(){ 11 return 'abc'; 12 } 13 alert(window.run()); //abc 14 alert(global.run()); //error global not undefined 15 alert(Global.run()); //error global not undefined View Code?
3、URI編碼方法--Global對象的內置方法 ???
URI編碼方法可以編碼連接,以便發送給瀏覽器,采用特殊的UTF-8編碼特殊的不認識的字符,比如在瀏覽器的地址欄中有漢字的時候,IE顯示的結果就是編碼的,如果不編碼或者編碼瀏覽器不認識,就會顯示一個亂碼結果就是找不到連接中所要請求的頁面 ???
encodeURI(box): 對變量box進行編碼,但是這個方法不能夠對URI本身特殊字符編碼,比如 正斜杠,#,冒號,問號等不會編碼,但是會編碼漢字等 ??
encodeURIComponent(box): 完全編碼,它會將發現的URI中所有的非標準字符進行編碼。因為編碼徹底,故使用的頻率要比不完全編碼(encodeURI())方法多很多。
1 //編碼方法 encodeURI() encodeURIComponent() 2 //encodeURI()不會對斜杠,冒號問號和#等編碼 encodeURIComponent則會對它發現的全部非標準字符進行編碼 3 var box='//abc??123::hhh|||但是'; 4 alert(box); 5 alert(encodeURI(box)); //結果為: //abc??123::hhh%7C%7C%7C%E4%BD%86%E6%98%AF 6 alert(encodeURIComponent(box)); //結果為: %2F%2Fabc%3F%3F123%3A%3Ahhh%7C%7C%7C%E4%BD%86%E6%98%AF View Code?
4、URI解碼方法--Global對象的內置方法????
通過上面兩種編碼方法進行編碼的URI,可以通過解碼方法進行解碼。然后還原可讀的URI ???
decodeURI(): 用來解碼由編碼方法 encodeURI()編碼的URI ???
decodeURIComponent(): 用來解碼由編碼方法 encodeURIComponent() 編碼的URI ???
解碼方法和編碼方法最好對應的使用,用什么方法編碼,就用對應的方法進行解碼,否則可能會造成解碼不出來或者解碼不完整
1 //解碼方法decodeURI() decodeURIComponent() 解碼方法必須要和編碼的方法進行對應使用,否則可能解碼不徹底 2 //下面的例子中不完全解碼就不能夠解碼完全編碼中關于特殊字符的編碼結果,雖然完全解碼將不完全編碼結果解碼正確 3 //但是也不要這樣套用,函數、命令等最好是成套使用 4 var box='//abc??123::hhh|||但是'; 5 var code1=encodeURI(box); //用不完全編碼方式進行編碼 6 var code2=encodeURIComponent(box); //用完全編碼方式進行編碼 7 alert(decodeURI(code1)); //用不完全解碼方式解碼不完全編碼結果: //abc??123::hhh|||但是 8 alert(decodeURI(code2)); //用不完全解碼方式解碼完全編碼結果: %2F%2Fabc%3F%3F123%3A%3Ahhh|||但是 9 alert(decodeURIComponent(code1)); //用完全解碼方式解碼不完全編碼結果://abc??123::hhh|||但是 10 alert(decodeURIComponent(code2)); //用完全解碼方式解碼完全編碼結果: //abc??123::hhh|||但是 View Code?
5、eval 方法--Global對象內置方法 ???
eval()方法是用來擔當一個字符串解析器的作用,只是接收一個參數,而這個參數中就是要執行的JS代碼,多余的參數會忽略的,此方法可能有返回值也可能沒,要根據參數中的JS代碼而定,在AJAX中傳遞參數的時候很有用 ???
如果解析的字符串中的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如果字符串中定義有函數,或者變量等,和正則表達式中的一些屬性一樣,需要先執行以下,也就是說先解析一下(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); //123eval() 方法雖然很好用,功能很強大,但是也是很危險的方法,因此在使用的時候應該謹慎使用。特別是在用戶輸入數據的時候,很可能會導致程序的安全性問題,比如代碼注入等等
?
6、Global 內置的一些屬性 ???
有很多屬性,比如 undefined,Array,NaN,Object,Function 等,alert(Array);返回的就是數組類型Array的構造函數,也就是調用Array.constructor 時候的返回值
?
7、window對象 ???
前面說了,由于無法對Global對象進行全局訪問,而Web對象把window對象當做全局對象來訪問,alert(window.Array);的結果和上面是一樣返回的是數組的構造方法
?
8、Math對象 ???
Math對象是ECMAScript為了保存數學公式和信息而提供的一個對象,這個對象中的屬性和方法的執行效率要比我們直接在JS中編寫數學公式的效率高很多
9、Math對象的屬性 ???
Math對象的屬性都是在平時的計算中很多時候都會用到的一些特殊的值,注意大小寫 ?
| ? |
?
10、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 Code
?
11、舍入方法 ???
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 Code
?
12、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 Code
?
13、其它的數學方法 ?
| ? |
?
求正切的時候結果不是很精確: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/qigang/p/3520974.html
總結
以上是生活随笔為你收集整理的JS 学习笔记--11---内置对象(Global/Math)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第2天:Ansible-Inventor
- 下一篇: C#(.Net)中调用Sql sever