我正在编写代码的一部分,我有一个类似于[[data]]
的数组。 data
通过Django模板引擎在服务器端呈现。所以我的代码看起来像这样:
var data = {{ series|safe }};
// data will be [[]] if no data is present
if (data ==[[]])
console.log('no data');
if
始终返回false
。这意味着在[[]] == [[]]
false
中我的测试显示[]==[]
也是false
。
任何描述都将不胜感激。
答案 0 :(得分:11)
因为==
(和===
)测试两个对象是否是相同的对象而不是相同的对象。< / p>
如果您想查看两个对象是否相同,大多数测试框架都会包含deepEqual
等函数。
答案 1 :(得分:7)
表达式[] == []
的等效符号为:
new Array() == new Array()
知道Array
也是Object
,The Abstract Equality Comparison Algorithm的ECMAScript Language Specification部分明确解释了比较的行为:
比较x == y,其中x和y是值,产生true或false。这样的比较如下进行:
您的比较结果由上面突出显示的1.6
解释。
替代表达
在你的情况下,我建议只使用这个条件:
if (a[0].length == 0) {
console.log('no data');
}
答案 2 :(得分:3)
因为[]
创建了一个新数组,所以你要将一个数组对象与另一个数组对象进行比较。
不是比较的数组的内容,比较对象引用。它们不相等,因为它不是同一个对象实例。
答案 3 :(得分:2)
Javascript与Java类似,==
运算符比较基本类型的值,但引用对象。你正在创建两个数组,而==
运算符告诉你它们没有指向内存中相同的对象:
var b = new Array( 1, 2, 3 );
var c = new Array( 1, 2, 3 );
console.log(b == c); // Prints false.
console.log(b == b); // Prints true.
console.log(b === c); // Prints false.
b = c;
console.log(b == c); // Now prints true.
如果要比较对象的值,则必须手动执行deep comparison。
答案 4 :(得分:0)
因为它们是数组的不同实例,因此不相等。
答案 5 :(得分:0)
因为数组是引用类型,也就是说,例如,如果您创建一个数组
让a = [1,2,3,4,5];
让b = a;
b实际上只是数组a的引用,所以如果比较它们
a === b为真,
因为它们基本上是链接在一起的。所以,如果将某些内容更改为数组b,那么也将更改为数组a,
b [0] =“测试”;
数组a现在为[“ test”,2,3,4,5];
但是如果您这样做
让a = [1,2,3,4,5];
让b = a.slice(0);
然后比较
a === b为假
因为现在它们都是不同的数组,这意味着如果更改数组b,将不会影响数组a
b [0] =“ hello”;
数组a仍为 [1,2,3,4,5]
而数组b现在为 [“ hello”,2,3,4,5]
当您比较 [] === []为假
时,也会发生这种情况因为基本上您要向JavaScript询问的是它们是否是同一数组而不是