javascript
JS 学习笔记--11---内置对象(Global/Math)
練習(xí)中使用的瀏覽器是IE10,如果各位朋友有不同意見(jiàn)或者遇到瀏覽器不兼容問(wèn)題,希望指正?
1、內(nèi)置對(duì)象的定義:有ECMAScript實(shí)現(xiàn)提供的、不依賴與宿主環(huán)境的對(duì)象,在ECMAScript運(yùn)行之前就已經(jīng)創(chuàng)建好的對(duì)象就叫做內(nèi)置對(duì)象。就是說(shuō),是不需要我們開(kāi)發(fā)人員先是的實(shí)例化對(duì)象就能夠調(diào)用和運(yùn)行的對(duì)象。 在ECM-262中只是定義了兩個(gè)內(nèi)置對(duì)象 Global和Math對(duì)象
?
2、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ì)象的方法和屬性。
1 //ECMAScript 中沒(méi)有定義怎么調(diào)用Global對(duì)象,故Global.屬性 或者Global.方法 都是無(wú)效的 2 //Web瀏覽器中將global作為window對(duì)象的一部分來(lái)加以實(shí)現(xiàn) 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對(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())方法多很多。
1 //編碼方法 encodeURI() encodeURIComponent() 2 //encodeURI()不會(huì)對(duì)斜杠,冒號(hào)問(wèn)號(hào)和#等編碼 encodeURIComponent則會(huì)對(duì)它發(fā)現(xiàn)的全部非標(biāo)準(zhǔn)字符進(jìn)行編碼 3 var box='//abc??123::hhh|||但是'; 4 alert(box); 5 alert(encodeURI(box)); //結(jié)果為: //abc??123::hhh%7C%7C%7C%E4%BD%86%E6%98%AF 6 alert(encodeURIComponent(box)); //結(jié)果為: %2F%2Fabc%3F%3F123%3A%3Ahhh%7C%7C%7C%E4%BD%86%E6%98%AF View Code?
4、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)或者解碼不完整
1 //解碼方法decodeURI() decodeURIComponent() 解碼方法必須要和編碼的方法進(jìn)行對(duì)應(yīng)使用,否則可能解碼不徹底 2 //下面的例子中不完全解碼就不能夠解碼完全編碼中關(guān)于特殊字符的編碼結(jié)果,雖然完全解碼將不完全編碼結(jié)果解碼正確 3 //但是也不要這樣套用,函數(shù)、命令等最好是成套使用 4 var box='//abc??123::hhh|||但是'; 5 var code1=encodeURI(box); //用不完全編碼方式進(jìn)行編碼 6 var code2=encodeURIComponent(box); //用完全編碼方式進(jìn)行編碼 7 alert(decodeURI(code1)); //用不完全解碼方式解碼不完全編碼結(jié)果: //abc??123::hhh|||但是 8 alert(decodeURI(code2)); //用不完全解碼方式解碼完全編碼結(jié)果: %2F%2Fabc%3F%3F123%3A%3Ahhh|||但是 9 alert(decodeURIComponent(code1)); //用完全解碼方式解碼不完全編碼結(jié)果://abc??123::hhh|||但是 10 alert(decodeURIComponent(code2)); //用完全解碼方式解碼完全編碼結(jié)果: //abc??123::hhh|||但是 View Code?
5、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í)候很有用 ???
如果解析的字符串中的JS代碼是定義變量,比如說(shuō)數(shù)組對(duì)象,字符串等代碼,則會(huì)返回這些定義結(jié)果,并且還原真正的類(lèi)型;如果是定義一個(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")'; //注意要寫(xiě)正確這里面的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如果字符串中定義有函數(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); //123eval() 方法雖然很好用,功能很強(qiáng)大,但是也是很危險(xiǎn)的方法,因此在使用的時(shí)候應(yīng)該謹(jǐn)慎使用。特別是在用戶輸入數(shù)據(jù)的時(shí)候,很可能會(huì)導(dǎo)致程序的安全性問(wèn)題,比如代碼注入等等
?
6、Global 內(nèi)置的一些屬性 ???
有很多屬性,比如 undefined,Array,NaN,Object,Function 等,alert(Array);返回的就是數(shù)組類(lèi)型Array的構(gòu)造函數(shù),也就是調(diào)用Array.constructor 時(shí)候的返回值
?
7、window對(duì)象 ???
前面說(shuō)了,由于無(wú)法對(duì)Global對(duì)象進(jìn)行全局訪問(wèn),而Web對(duì)象把window對(duì)象當(dāng)做全局對(duì)象來(lái)訪問(wèn),alert(window.Array);的結(jié)果和上面是一樣返回的是數(shù)組的構(gòu)造方法
?
8、Math對(duì)象 ???
Math對(duì)象是ECMAScript為了保存數(shù)學(xué)公式和信息而提供的一個(gè)對(duì)象,這個(gè)對(duì)象中的屬性和方法的執(zhí)行效率要比我們直接在JS中編寫(xiě)數(shù)學(xué)公式的效率高很多
9、Math對(duì)象的屬性 ???
Math對(duì)象的屬性都是在平時(shí)的計(jì)算中很多時(shí)候都會(huì)用到的一些特殊的值,注意大小寫(xiě) ?
| ? |
?
10、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 Code
?
11、舍入方法 ???
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 Code
?
12、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 Code
?
13、其它的數(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è)是屬性中的開(kāi)平方根 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/qigang/p/3520974.html
總結(jié)
以上是生活随笔為你收集整理的JS 学习笔记--11---内置对象(Global/Math)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 第2天:Ansible-Inventor
- 下一篇: C#(.Net)中调用Sql sever