精彩的javascript對象和數組混合相加

最近遇到一個讓人困解的一個問題;一個簡單的js加法運算表達式:javascript

1 +[]; //這裏加上一個空數組獲得什麼???
答案:'1';

爲何答案是1,一開始我也很困惑;後來我讀了一篇文章才知道:在javascript中加法的規則很簡單,只能數字與數字相加或字符串和字符串相加;全部其餘類型的值都會自動轉換成這兩個類型的值。這裏面其實有一個隱式轉換的存在。這裏就不得不說javascript的兩種類型的值了;即原始值和對象值(或者說引用類型的值),原始值有undefined,null,boolean,number,String;而其餘的值都是對象值包括數組(Array)和函數(function);判斷一個值是不是原始類型的值的話能夠使用typeof,判斷是不是對象值的話能夠使用instanceOf;這裏要注意的是typeof null;//'object'獲得的是object;這裏w3School上的解釋是javascript最初實現的一個錯誤,而後被ECMAScript沿用了。如今null被認爲是對象的佔位符,從而解釋了這一矛盾。但從技術上來講null還是原始值。html

類型轉換java

javascript中加法會觸發3種類型轉換;即將值轉換爲原始值,轉換爲字符串,轉換爲數字。這恰好對應了javascript引擎內部的轉換操做:ToPrimitive(),toString(),toNumber;數組

因此這裏:1 + [] = '1';即[].toString() = ''; 而後1 + '' = '1';即把1轉換成字符串,'1' + '' = '1' 最後就是兩個字符串鏈接成的字符串;(詳細可見w3School中的javascript加法運算http://www.w3school.com.cn/js/pro_js_operators_additive.asp)函數

明白了這個接下來的加法運算也就一目瞭然了:spa

+[] = 0; //其實就是Number([]),當Number做爲一個函數調用(而不是做爲構造函數調用時)會在引擎內部執行toNumber操做
+{} = NaN; // Number('[object,object]'); -->NaN 即String({})='[object,object]'; +'[object, object]' = NaN
1 + [1] = '11'; // String({}) = '1' --> '1' + '1' = '11'
1 + [1, 2] = '11,2'; // String([1,2]) = '1,2' ---> '1' + '1,2' = '11,2';
1+ {} = '1[object,object]'; String({}) = '[object, object]' ---> '1' + '[object, object]' = '1[object,object]';
[]+[] = ''; // 其實就是String([]) = '';---> '' + '' = '';
[]+{} = '[object,object]'; //同上String([]) = '', String({}) = '[object,object]' ---> '' + '[object, object]' = '[object, object]';
{} + {} = NaN;//這裏值得注意的是javascript會把第一個{}解釋成一個空塊並忽略了它因此這裏等價於+{}


參考:http://www.2ality.com/2011/03/javascript-values-not-everything-is.htmlcode

相關文章
相關標籤/搜索