为什么JavaScript中的[] == []为false?

时间:2012-12-04 12:44:46

标签: javascript operators comparison-operators

我正在编写代码的一部分,我有一个类似于[[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

任何描述都将不胜感激。

6 个答案:

答案 0 :(得分:11)

因为==(和===)测试两个对象是否是相同的对象而不是相同的对象。< / p>

如果您想查看两个对象是否相同,大多数测试框架都会包含deepEqual等函数。

答案 1 :(得分:7)

表达式[] == []的等效符号为:

new Array() == new Array()

知道Array也是ObjectThe Abstract Equality Comparison AlgorithmECMAScript Language Specification部分明确解释了比较的行为:

比较x == y,其中x和y是值,产生true或false。这样的比较如下进行:

  1. 如果Type(x)与Type(y)相同,那么
    1. 如果Type(x)为Undefined,则返回true。
    2. 如果Type(x)为Null,则返回true。
    3. 如果Type(x)是Number,那么
      1. 如果x为NaN,则返回false。
      2. 如果y为NaN,则返回false。
      3. 如果x与y的数字值相同,则返回true。
      4. 如果x为+0且y为-0,则返回true。
      5. 如果x为-0且y为+0,则返回true。
      6. 返回false。
    4. 如果Type(x)是String,则如果x和y完全相同的字符序列(相应位置的长度和字符相同),则返回true。否则,返回false。
    5. 如果Type(x)是布尔值,如果x和y都为true或两者都为false,则返回true。否则,返回false。
    6. 如果x和y引用同一个对象,则返回true。否则,返回false。
  2. 如果x为null且y未定义,则返回true。
  3. 如果x未定义且y为null,则返回true。
  4. 如果Type(x)是Number而Type(y)是String, 返回比较结果x == ToNumber(y)。
  5. 如果Type(x)是String而Type(y)是Number, 返回比较结果ToNumber(x)== y。
  6. 如果Type(x)是布尔值,则返回比较结果ToNumber(x)== y。
  7. 如果Type(y)是布尔值,则返回比较结果x == ToNumber(y)。
  8. 如果Type(x)是String或Number而Type(y)是Object, 返回比较结果x == ToPrimitive(y)。
  9. 如果Type(x)是Object而Type(y)是String或Number, 返回比较结果ToPrimitive(x)== y。
  10. 返回false。
  11. 您的比较结果由上面突出显示的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询问的是它们是否是同一数组而不是