var arr = new Array(); // 或 var arr = [];
我們知道,初始化后,即使數組arr中沒有元素,也是一個object。
typeof arr; // "object"
既然是object,用於判斷條件時就會被轉化為true。
if(arr)console.log("it's true"); // it's true
但是,如果將arr與布爾值比較:
arr == false; // true arr == true; // false
可是,如果把arr轉化為Boolean,的確是true:
Boolean(arr); // true
那arr與布爾值比較時,到底發生了什么?
原來,任意值與布爾值比較,都會將兩邊的值轉化為Number。
如arr與false比較,false轉化為0,而arr為空數組,也轉化為0。
Number(false) // 0 Number(arr) // 0
所以,當空數組作為判斷條件時,相當於true。當空數組與布爾值直接比較時,相當於false。
也就出現了以下令人繞圈的現象:
[] == ![]; // true
如何避免數組與布爾值比較時出現的坑呢?可以先把數組轉化為布爾值:
Boolean(arr) == true; // true
有同學問:
new Array() == [];
必須是false,就和new Array() == new Array()一樣。是不同的兩個對象。
但有個問題很奇怪:
new Array(1) == false; // true // 或 [undefined] == false; // true
這個怎么解釋呢?Number(new Array(1))為什么會是0呢?