这有点类似于split() in javascript,但这是我的问题,而且它更具理论性而非实用性
我有一个如下所示的数组:
var array = ["abc", "def"]
当我这样做时
debug(array === array.toString().split(","));
我弄错了,我试过==这也是假的。我做了一个数组的调试转储和连接/拆分数组,它们在输出中看起来完全相同。它们之间有什么区别导致这个评估为假?
我认为我的代码非常清楚,我可以使用数组而无需使用toString.split(我认为现在已经不再需要了),我只是好奇这里发生了什么。< / p>
答案 0 :(得分:5)
因为array.toString().split(",")
返回数组的新实例。作为对象的数组只有在它们是数组的完全相同的实例时才相等:
var a = [1,2];
var b = [1,2];
var c = a;
alert(a == c); // true
alert(a == b); // false - not even loose comparison can save you
答案 1 :(得分:5)
==
和===
运算符都不会检查数组的内容。相反,它们测试两个操作数是否在内存中引用相同的数组实例。注意:
['a', 'b'] === ['a', 'b']; // false
var arr = ['a', 'b'];
arr === arr; // true
换句话说,当您比较两个不同的数组时,==
或===
将始终返回false;
答案 2 :(得分:1)
引自MDN Doc for Comparison Operators,
请注意,当且仅当其比较是基元时,对象才会转换为基元。如果两个操作数都是对象,则将它们作为对象进行比较,只有当两个操作数都引用同一个对象时,相等性测试才为真。
因此,如果我们比较任何两个对象,那么==
和===
都会检查它们是否相同。您可以像这样检查
console.log({} == {});
# false
console.log({} === {});
# false
console.log([] == []);
# false
console.log([] === []);
# false
我相信原因可能是,Arrays和Objects可以嵌套,并且很难检查两个对象是否相等。
答案 3 :(得分:0)
==
和===
运算符不会比较数组的内容。他们只是检查两个Arrays是否实际上是同一个Array对象。
答案 4 :(得分:0)
数组不是基本类型,它们不是相同的引用。
var a = ["a"];
var b = ["a"];
console.log(a == b); //false