1. 非數值類型轉數值
使用Number()
轉換時:
使用parseInt()
轉換時:
var num1 = parseInt("10",2); //2 按二進制解析 var num2 = parseInt("10",8); //8 按八進制解析 var num3 = parseInt("10",10); //10 按十進制解析 var num4 = parseInt("10",16); //16 按十六進制解析
使用parseFloat()
轉換時:
parseFloat和parseInt的第一個區別在於它在解析字符串是是遇到一個無效的浮點數值字符為止,比parseInt多了.
解析十六進制數值時返回0
var num = parseFloat("0xA"); //0 var num = parseInt("0xA"); //10
parseFloat函數沒有第二個可以指定基數的參數,所以只解析十進制值。
如果字符串是個整數,則返回整數而不是浮點數
var num = parseFloat("2.125e7"); //31250000
2. 使用toString()輸出不同進制的數值
此條適用於整數,我們可以用toString()返回任意進制的整數。
var num = 10; alert(num.toString()); //"10" alert(num.toString(9)); //"11" alert(num.toString(16)); //"a"
3. 位操作符時注意NaN和Infinity
在對NaN和Infinity使用位操作符時,這兩個數值都會被當成0來處理。 如果對於非數值應用位操作符,會先使用Number()函數將該值轉換為一個數值。
還有一點要注意的就是負數的無符號右移,無符號右移是以0來填充空位,而不像有符號右移以符號位填充空位,所以對正數的無符號右移和有符號右移結果相同,但對負數就不同了。無符號右移操作會把負數的二進制碼當成正數的二進制碼,而且負數是以補碼形式表示,因此會導致無符號右移後的結果相差非常大。
var oldValue = -64; var newValue = oldValue >>> 5
4. 特殊的數值運算
對於數值運算,如果有一個操作數為NaN,則結果為NaN。
對非數值應用使用一元加操作或減操作(+,-,正負號),如果該值無法轉換為數值(使用Number()方式轉換),則返回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數相乘為Infinity和-Infinity,取決於乘數的正負號。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,非零數除以零為Infinity或-Infinity。Infinity除以Infinity為NaN
對於取模運算,下面等式成立:
Infinity%2=NaN; 2%-Infinity=2; 0%Infinity=0; //只要被除數為0,除數不為NaN,結果都為0 Infinity%0=NaN; //被除數可以為任意數,除數只要為0,結果都為NaN Infinity%Infinity=NaN
加法運算:如果兩個操作數都是字符串則+變為字符串連接。如果一個為字符串,一個為數值,將數值轉換為字符串,然後連接字符串,如果一個操作數是對象,布爾值則先調用它們的valueOf方法,如無,在調用toString方法。再根據返回值類型,判斷+號應該連接字符串還是相加。
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 字符串連接
減法運算:減法運算和加法運算十分相似,關於對象的處理也是一樣,所以不再說明。
Infinity - Infinity = NaN; -Infinity - -Infinity = NaN;
5. 關系操作符的使用
關系操作符就是小於(<)、大於(>)、小於等於(<=)和大於等於(>=)
只要有一個數值,就會執行數值比較,另一個不為數值,則轉為數值。對象先用valueOf,後用toString。其實對象無論執行什麼運算都是這樣,有valueOf,則用valueOf返回值,否則使用toString返回值。
兩個都為字符串,則比較字符串的字符編碼值(ASCII值)
關於第一個還要注意,在一個時候字符串一個是數值時,字符串無法轉數值時,即為NaN會出現如下情況
var result = "a" < 3; //false a轉換為NaN var result = "a" >= 3; //false 任何數和NaN進行相比都為false
6. ==和===
在JavaScript中,如果等式兩邊類型不同,或者僅包含一個對象,那麼比較會分為兩種情況,轉型後比較和不轉型直接比較。 ==是先轉換在比較,===是不轉換直接比較。 對於來說===,只要類型不相等就返回false。 而對於==來說,分為如下幾種情況:
true會轉換為1,false會轉換為0。
字符串和數值比較,字符串會轉換為數值。
如果等式兩邊只有一個對象,這個對象會調用valueOf得到基本類型,如無valueOf方法調用toString方法。如果兩邊都是對象則不轉型。
var p = { "name":"a" }; var q = { "name":"a" } var o =p; alert(q==p); //false p和q指向的對象的地址不同,雖然對象的內容是相同的 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語句輸出順序不可預測,次序可能因為浏覽器不同而有所差異。
要迭代的變量未null或undefined時,ECMAScript 5下不再拋出錯誤而是不執行循環體。如果想向前兼容,則在循環前判斷不為null或undefined。
8. swithc語句
switch可以使用任何數據類型。
case的值可以是常量,變量和表達式。
switch語句在比較值時使用的是全等比較操作符(===)。
var num = 25; switch (true) { case num<0: alert("less 0"); break; case num>=0: alert("more than 0"); break; default: alert("error"); }
9 函數的使用
函數內沒有return語句或return不帶任何返回值,則函數都會返回undefined。
函數的定義時和函數的調用時參數不比保持一致。換句話說兩種參數(形參和實參)並沒有任何聯系。函數定義時提供的變量只是使用時較為方便,就算不定義也可以獲得傳遞給函數的參數(通過arguments[])。
function howManyArgs(){ alert(arguments.length); } howManyArgs("a"); // 1 howManyArgs("a","b"); // 2 howManyArgs(); // 0
形參和arguments[]之間的關系如下,注意嚴格模式和非嚴格模式區別。
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. 函數參數的使用
在定義函數時,我們會把用到的參數寫到函數的括號內,但是在有多個可選參數的情況下就會不夠靈活,這個時候可以使用對象封裝多個可選參數。
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" });