之前學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都落下了~