13

我正在处理代码的一部分,其中我有一个看起来像[[data]]. 通过dataDjango 模板引擎在服务器端呈现。所以我的代码如下所示:

var data = {{ series|safe }}; 
// data will be [[]] if no data is present
if (data ==[[]])
  console.log('no data');

if总是false返回。这意味着在[[]] == [[]]false,我的测试表明[]==[]也是false如此。

任何描述将不胜感激。

4

6 回答 6

16

Because == (and ===) test to see if two objects are the same object and not if they are identical objects.

Most test frameworks will include functions such as deepEqual if you want to see if two objects are identical.

于 2012-12-04T12:46:48.060 回答
12

该表达式[] == []具有以下等价符号:

new Array() == new Array()

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

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

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

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

替代表达

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

if (a[0].length == 0) {
    console.log('no data');
}
于 2012-12-04T12:48:38.417 回答
6

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

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

于 2012-12-04T12:48:10.840 回答
3

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.

如果要比较对象的值,则必须手动进行深度比较。

于 2012-12-04T13:06:21.250 回答
2

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

让 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 而不是

于 2018-06-23T07:26:18.713 回答
1

Because they are different instances of an Array, thus not equal.

于 2012-12-04T12:47:46.913 回答