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

Nas*_*sir 10 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');
Run Code Online (Sandbox Code Playgroud)

if始终返回false.这意味着在[[]] == [[]],false而我的测试表明[]==[]也是false如此.

任何描述将不胜感激.

Que*_*tin 13

因为==(和===)测试两个对象是否是同一个对象而不是它们是相同的对象.

大多数测试框架将包含诸如deepEqual您想要查看两个对象是否相同的功能.


Ja͢*_*͢ck 9

该表达式[] == []具有等效符号:

new Array() == new Array()
Run Code Online (Sandbox Code Playgroud)

并且知道这Array也是一个Object,在ECMAScript语言规范的抽象等式比较算法部分中明确地解释了比较的行为:

比较x == y,其中x和y是值,产生真或假.这样的比较如下进行:

  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的Number值相同,则返回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.

您的比较结果将在1.6上面突出显示.

另类表达

在你的情况下,我建议只使用这个条件:

if (a[0].length == 0) {
    console.log('no data');
}
Run Code Online (Sandbox Code Playgroud)


Guf*_*ffa 6

因为[]创建了一个新数组,所以您将一个数组对象与另一个数组对象进行比较。

不是比较数组的内容,而是比较对象引用。它们不相等,因为它不是同一个对象实例。