每日十條JavaScript經(jīng)驗(yàn)技巧(二)
1. 非數(shù)值類型轉(zhuǎn)數(shù)值
使用Number()
轉(zhuǎn)換時(shí):
- undefined會轉(zhuǎn)為NaN
- 如果字符串以0開始,瀏覽器會忽略前導(dǎo)0,不會按照八進(jìn)制進(jìn)行轉(zhuǎn)換
- 如果字符串以0x開始,瀏覽器會按照十六進(jìn)制轉(zhuǎn)化為十進(jìn)制返回
- 如果字符串有字符,除(+,-,.)外都會轉(zhuǎn)為NaN,十六進(jìn)制時(shí),字符串包含任何非數(shù)字字符都返回NaN
- 如果是對象轉(zhuǎn)換,則對象先使用valueof(),然后按照規(guī)則轉(zhuǎn)換。如果無valueOf方法,則調(diào)用toString方法,再轉(zhuǎn)換。
使用parseInt()
轉(zhuǎn)換時(shí):
- parseInt會忽略前導(dǎo)空格,直到第一個(gè)非空字符開始解析,如果為非數(shù)字或正負(fù)號,則返回NaN。如果為數(shù)字則一直解析到第一個(gè)非數(shù)字為止。注:在parseInt中小數(shù)點(diǎn)不是有效的數(shù)字字符
- parseInt能識別十進(jìn)制,八進(jìn)制和十六進(jìn)制,但是在解析八進(jìn)制時(shí),ECMAScript 3 和ECMAScript 5存在分歧,ECMAScript 3會將070轉(zhuǎn)化為56,但是ECMAScript 5會轉(zhuǎn)換為70。
- 使用parseInt的第二個(gè)參數(shù)
var num1 = parseInt("10",2); //2 按二進(jìn)制解析 var num2 = parseInt("10",8); //8 按八進(jìn)制解析 var num3 = parseInt("10",10); //10 按十進(jìn)制解析 var num4 = parseInt("10",16); //16 按十六進(jìn)制解析
使用parseFloat()
轉(zhuǎn)換時(shí):
parseFloat和parseInt的第一個(gè)區(qū)別在于它在解析字符串是是遇到一個(gè)無效的浮點(diǎn)數(shù)值字符為止,比parseInt多了.
解析十六進(jìn)制數(shù)值時(shí)返回0
var num = parseFloat("0xA"); //0 var num = parseInt("0xA"); //10
parseFloat函數(shù)沒有第二個(gè)可以指定基數(shù)的參數(shù),所以只解析十進(jìn)制值。
如果字符串是個(gè)整數(shù),則返回整數(shù)而不是浮點(diǎn)數(shù)
var num = parseFloat("2.125e7"); //31250000
2. 使用toString()輸出不同進(jìn)制的數(shù)值
此條適用于整數(shù),我們可以用toString()返回任意進(jìn)制的整數(shù)。
var num = 10; alert(num.toString()); //"10" alert(num.toString(9)); //"11" alert(num.toString(16)); //"a"
3. 位操作符時(shí)注意NaN和Infinity
在對NaN和Infinity使用位操作符時(shí),這兩個(gè)數(shù)值都會被當(dāng)成0來處理。 如果對于非數(shù)值應(yīng)用位操作符,會先使用Number()函數(shù)將該值轉(zhuǎn)換為一個(gè)數(shù)值。
還有一點(diǎn)要注意的就是負(fù)數(shù)的無符號右移,無符號右移是以0來填充空位,而不像有符號右移以符號位填充空位,所以對正數(shù)的無符號右移和有符號右移結(jié)果相同,但對負(fù)數(shù)就不同了。無符號右移操作會把負(fù)數(shù)的二進(jìn)制碼當(dāng)成正數(shù)的二進(jìn)制碼,而且負(fù)數(shù)是以補(bǔ)碼形式表示,因此會導(dǎo)致無符號右移后的結(jié)果相差非常大。
var oldValue = -64; var newValue = oldValue >>> 5
4. 特殊的數(shù)值運(yùn)算
對于數(shù)值運(yùn)算,如果有一個(gè)操作數(shù)為NaN,則結(jié)果為NaN。
對非數(shù)值應(yīng)用使用一元加操作或減操作(+,-,正負(fù)號),如果該值無法轉(zhuǎn)換為數(shù)值(使用Number()方式轉(zhuǎn)換),則返回NaN。
var s1 = "01", s2 = "1.1", s3 = "z", b = false, o = { valueOf: function(){ return -1; } }; s1 = +s1; //1 +改為-: -1 s2 = +s2; //1.1 -1.1 s3 = +s3; //NaN NaN b = +b; //0 0 o = -o; //-1 1
Infinity和0相乘等于NaN,和非0數(shù)相乘為Infinity和-Infinity,取決于乘數(shù)的正負(fù)號。Infinity和Infinity相乘等于Infinity。
var num1 =Infinity, num2 = 0, num3 = -2 ,num4 = -Infinity; alert(num1 * num2); //NaN alert(num1 * num3); //-Infinity alert(num1 * num4); //-Infinity
零除零為NaN,非零數(shù)除以零為Infinity或-Infinity。Infinity除以Infinity為NaN
對于取模運(yùn)算,下面等式成立:
Infinity%2=NaN; 2%-Infinity=2; 0%Infinity=0; //只要被除數(shù)為0,除數(shù)不為NaN,結(jié)果都為0 Infinity%0=NaN; //被除數(shù)可以為任意數(shù),除數(shù)只要為0,結(jié)果都為NaN Infinity%Infinity=NaN
加法運(yùn)算:如果兩個(gè)操作數(shù)都是字符串則+變?yōu)樽址B接。如果一個(gè)為字符串,一個(gè)為數(shù)值,將數(shù)值轉(zhuǎn)換為字符串,然后連接字符串,如果一個(gè)操作數(shù)是對象,布爾值則先調(diào)用它們的valueOf方法,如無,在調(diào)用toString方法。再根據(jù)返回值類型,判斷+號應(yīng)該連接字符串還是相加。
Infinity + -Infinity = NaN; var p = { valueOf: function () { return -1; } }; var num =1; var result = num +p; alert(result); // 0 相加 var p = { valueOf: function () { return "not a num"; } }; var num =1; var result = num +p; alert(result); //1not a num 字符串連接
減法運(yùn)算:減法運(yùn)算和加法運(yùn)算十分相似,關(guān)于對象的處理也是一樣,所以不再說明。
Infinity - Infinity = NaN; -Infinity - -Infinity = NaN;
5. 關(guān)系操作符的使用
關(guān)系操作符就是小于(<)、大于(>)、小于等于(<=)和大于等于(>=)
只要有一個(gè)數(shù)值,就會執(zhí)行數(shù)值比較,另一個(gè)不為數(shù)值,則轉(zhuǎn)為數(shù)值。對象先用valueOf,后用toString。其實(shí)對象無論執(zhí)行什么運(yùn)算都是這樣,有valueOf,則用valueOf返回值,否則使用toString返回值。
兩個(gè)都為字符串,則比較字符串的字符編碼值(ASCII值)
關(guān)于第一個(gè)還要注意,在一個(gè)時(shí)候字符串一個(gè)是數(shù)值時(shí),字符串無法轉(zhuǎn)數(shù)值時(shí),即為NaN會出現(xiàn)如下情況
var result = "a" < 3; //false a轉(zhuǎn)換為NaN var result = "a" >= 3; //false 任何數(shù)和NaN進(jìn)行相比都為false
6. ==和===
在JavaScript中,如果等式兩邊類型不同,或者僅包含一個(gè)對象,那么比較會分為兩種情況,轉(zhuǎn)型后比較和不轉(zhuǎn)型直接比較。 ==是先轉(zhuǎn)換在比較,===是不轉(zhuǎn)換直接比較。 對于來說===,只要類型不相等就返回false。 而對于==來說,分為如下幾種情況:
true會轉(zhuǎn)換為1,false會轉(zhuǎn)換為0。
字符串和數(shù)值比較,字符串會轉(zhuǎn)換為數(shù)值。
如果等式兩邊只有一個(gè)對象,這個(gè)對象會調(diào)用valueOf得到基本類型,如無valueOf方法調(diào)用toString方法。如果兩邊都是對象則不轉(zhuǎn)型。
var p = { "name":"a" }; var q = { "name":"a" } var o =p; alert(q==p); //false p和q指向的對象的地址不同,雖然對象的內(nèi)容是相同的 alert(o==p); //true
下面是特殊的比較情況
null == undefined //true NaN != NaN //true NaN == NaN //false "NaN" == NaN //false undefined == 0 //false null == 0 //false
7. for-in語句
for-in語句輸出順序不可預(yù)測,次序可能因?yàn)闉g覽器不同而有所差異。
要迭代的變量未null或undefined時(shí),ECMAScript 5下不再拋出錯(cuò)誤而是不執(zhí)行循環(huán)體。如果想向前兼容,則在循環(huán)前判斷不為null或undefined。
8. swithc語句
switch可以使用任何數(shù)據(jù)類型。
case的值可以是常量,變量和表達(dá)式。
switch語句在比較值時(shí)使用的是全等比較操作符(===)。
var num = 25; switch (true) { case num<0: alert("less 0"); break; case num>=0: alert("more than 0"); break; default: alert("error"); }
9 函數(shù)的使用
函數(shù)內(nèi)沒有return語句或return不帶任何返回值,則函數(shù)都會返回undefined。
函數(shù)的定義時(shí)和函數(shù)的調(diào)用時(shí)參數(shù)不比保持一致。換句話說兩種參數(shù)(形參和實(shí)參)并沒有任何聯(lián)系。函數(shù)定義時(shí)提供的變量只是使用時(shí)較為方便,就算不定義也可以獲得傳遞給函數(shù)的參數(shù)(通過arguments[])。
function howManyArgs(){ alert(arguments.length); } howManyArgs("a"); // 1 howManyArgs("a","b"); // 2 howManyArgs(); // 0
形參和arguments[]之間的關(guān)系如下,注意嚴(yán)格模式和非嚴(yán)格模式區(qū)別。
function howManyArgs(ss){ arguments[0]="test"; arguments[1]="test2" alert(arguments[0]); //test alert(arguments[1]); //test2 alert(ss); //test } howManyArgs("a"); function howManyArgs(ss){ "use strict" arguments[0]="test"; arguments[1]="test2" alert(arguments[0]); //test alert(arguments[1]); //test2 alert(ss); //a } howManyArgs("a");
10. 函數(shù)參數(shù)的使用
在定義函數(shù)時(shí),我們會把用到的參數(shù)寫到函數(shù)的括號內(nèi),但是在有多個(gè)可選參數(shù)的情況下就會不夠靈活,這個(gè)時(shí)候可以使用對象封裝多個(gè)可選參數(shù)。
function displayInfo(args){ var output = ""; if (typeof args.name == "string"){ output += "Name: " + args.name + "\n"; } if(typeof args.age == "number"){ output += "Age: "args.age + "\n"; } alert(output); } displayInfo({ name: "Nicholas", age: 29 }); displayInfo({ name: "Greg" });
- JS常用函數(shù)和常用技巧小結(jié)
- node.js路徑處理方法以及絕對路徑詳解
- JavaScript中apply方法的應(yīng)用技巧小結(jié)
- Web性能優(yōu)化系列 10個(gè)提升JavaScript性能的技巧
- javascript函數(shù)中的3個(gè)高級技巧
- JavaScript中Array的實(shí)用操作技巧分享
- javascript 四十條常用技巧大全
- jsp編程常用技巧小結(jié)
- 41個(gè)Web開發(fā)者必須收藏的JavaScript實(shí)用技巧
- 每日十條JavaScript經(jīng)驗(yàn)技巧(一)
- 靜態(tài)頁面html中跳轉(zhuǎn)傳值的JS處理技巧
- 12個(gè)非常實(shí)用的JavaScript小技巧【推薦】
- JavaScript奇技淫巧44招【實(shí)用】
相關(guān)文章
ES6下javascript解構(gòu)賦值常見用法總結(jié)
這篇文章主要介紹了在ES6下javascript賦值常見用法總結(jié),需要的朋友可以參考下2022-01-0121個(gè)JavaScript事件(Events)屬性匯總
本文介紹了學(xué)習(xí)JavaScript事件的21個(gè)屬性,算是對自己近期學(xué)習(xí)javascript的一個(gè)小小的總結(jié),這里推薦給大家。2014-12-12JavaScript高級程序設(shè)計(jì)(第3版)學(xué)習(xí)筆記13 ECMAScript5新特性
通常而言,JavaScript由ECMAScript核心、BOM和DOM三部分構(gòu)成,前面的文章將ECMAScript核心部分粗略的過了一篇2012-10-10script標(biāo)簽屬性用type還是language
本文介紹了javascript腳本中標(biāo)簽屬性type與language的區(qū)別分析,有需要的小伙伴可以參考下2015-01-01jquery中prop()方法和attr()方法的區(qū)別淺析
官方例舉的例子感覺和attr()差不多,也不知道有什么區(qū)別,既然有了prop()這個(gè)新方法,不可能沒用吧,那什么時(shí)候該用attr(),什么時(shí)候該用prop()呢2013-09-09JS排序方法(sort,bubble,select,insert)代碼匯總
新技術(shù)一直在不斷變化,掌握一些基礎(chǔ)是未來學(xué)習(xí)不斷更新的技術(shù)的堅(jiān)實(shí)基礎(chǔ)。近來閑來無事,為了溫習(xí)一下從前學(xué)的數(shù)據(jù)結(jié)構(gòu),將數(shù)據(jù)結(jié)構(gòu)中的排序算法用JS實(shí)現(xiàn)了一遍,2016-01-01