【问题标题】:Why [] == [] is false in JavaScript?为什么 [] == [] 在 JavaScript 中为假?
【发布时间】:2012-11-22 02:20:40
【问题描述】:

我正在处理代码的一部分,其中我有一个看起来像[[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

任何描述将不胜感激。

【问题讨论】:

标签: javascript operators comparison-operators


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

因为它们是 Array 的不同实例,因此不相等。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      表达式[] == [] 具有等价的符号:

      new Array() == new Array()
      

      知道Array 也是Object,比较的行为在ECMAScript Language SpecificationThe Abstract Equality Comparison Algorithm 部分中得到明确解释:

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

      1. 如果 Type(x) 与 Type(y) 相同,则
        1. 如果 Type(x) 未定义,则返回 true。
        2. 如果 Type(x) 为 Null,则返回 true。
        3. 如果类型(x)是数字,那么
          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) 是字符串,则如果 x 和 y 是完全相同的字符序列(相同长度和对应位置的相同字符),则返回 true。否则,返回 false。
        5. 如果 Type(x) 是布尔值,如果 x 和 y 都为真或都为假,则返回真。否则,返回 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) 是字符串并且 Type(y) 是数字, 返回比较结果 ToNumber(x) == y。
      6. 如果 Type(x) 是 Boolean,则返回比较结果 ToNumber(x) == y。
      7. 如果 Type(y) 为 Boolean,则返回比较结果 x == ToNumber(y)。
      8. 如果 Type(x) 是 String 或 Number 并且 Type(y) 是 Object, 返回比较结果 x == ToPrimitive(y)。
      9. 如果 Type(x) 是 Object 并且 Type(y) 是字符串或数字, 返回比较结果 ToPrimitive(x) == y。
      10. 返回 false。

      您的比较结果由1.6 解释,上面突出显示。

      另一种表达方式

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

      if (a[0].length == 0) {
          console.log('no data');
      }
      

      【讨论】:

        【解决方案5】:

        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

        【讨论】:

          【解决方案6】:

          因为数组是引用类型,这意味着,例如,如果你创建一个数组

          让 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] ="你好";

          数组 a 仍然是 [1,2,3,4,5]

          虽然数组 b 现在是 ["hello",2,3,4,5]

          当您比较 []===[] 为假时也会发生这种情况

          因为基本上你对 JavaScript 的要求是它们是否是相同的 Array 而不是

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-10
            • 1970-01-01
            • 2021-06-30
            • 1970-01-01
            • 1970-01-01
            • 2019-10-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多