JavaScript的賦值深坑

之前學C++的時候(大學時代),對傳參時印象深入的是,傳的仍是值的地址.node

以後學JavaScript的時候,發現不用理會那麼多,雖然不嚴謹,可是用起來很便捷,好比說類型轉換呀,啥的簡單多了.....編程

但是最近幾天就遇到了坑...數組

先上代碼:閉包

[]===[]  // false
[]==[]   // false

上面的代碼是用來判斷是否爲空數組用的.不巧的是,結果如你們看到的,起初我覺得是JavaScript的bug,也就不覺得然.由於JavaScript的坑仍是挺多了,並且以前也有大概的例子,以下:spa

表達式
null == undefined true
"NaN" == NaN false
5 == NaN false
NaN == NaN false
NaN != NaN true
false == 0 true
true == 1 true
true == 2 false
undefined == 0 false
null == 0 false
"5" == 5 true

因此,也就沒有多放在心上.....大膽的繼續前行去了~~code

但是最近又遇到了一個問題,是建立二維數組的時候:對象

    !function matrixAddition() {
        var temAry = [],
                newAry = [],
                i,
                j;
        for (i = 3; i--;) {
            for (j = 2; j--;) {
                temAry[j] = i + j;
            }
            newAry.push(temAry);
//            temAry =[];
            console.log("tem : "+temAry);
            console.log("new : "+newAry.join(","));

        }
        return newAry;
    }();
    
    結果是
    tem : 2,3 
    new : 2,3 
    tem : 1,2 
    new : 1,2,1,2 
    tem : 0,1 
    new : 0,1,0,1,0,1 
    
    
    
    若是把註釋去掉後,結果就正常了
    正確的結果
    tem :  
    new : 2,3 
    tem :  
    new : 2,3,1,2 
    tem : 
    new : 2,3,1,2,0,1

爲啥把temAry賦值空就沒事了...並且這裏也不存在閉包做用域的影響..ip

答案是:作用域

其實賦值的時候,並非賦值,而是賦了地址,緣由是array是一個對象.it

首先JavaScript中有5種簡單數據類型(也稱爲基本數據類型):Undefined、Null、Boolean、Number和String。還有1種複雜數據類型——Object,Object本質上是由一組無序的名值對組成的.

但用簡單類型賦值的時候的確給的是值,而在用其餘類型賦值的時候,則是給地址.

這也就順利成章的說明了 爲何[]==[].

題外話:果真我基礎仍是不紮實,決定重新看一遍<<JavaScript高級編程>>去,最近弄node太多了,JavaScript都落下了~

相關文章
相關標籤/搜索