2

我被要求用 Javascript 编写一个函数 sortByFoo 来正确响应这个测试:

// Does not crash on an empty array
console.log(sortByFoo([]) === []);

但我尝试了一些东西:

[] === [];
>> false

所以我可以肯定,这样的测试总是会失败,不管 sortByFoo 函数,不是吗?但我想解释一下为什么会发生这种情况。为什么 [] 不等于/等于 [] ?

请原谅我的近似英语,它不是我的母语:p

4

4 回答 4

4

如果您查看 javascript/ecmascript 的规范,特别是第 11.9.6 节,您将看到如何===执行与的比较。

严格等式比较算法

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

  1. 如果 Type(x) 与 Type(y) 不同,则返回 false。
  2. 如果 Type(x) 未定义,则返回 true。
  3. 如果 Type(x) 为 Null,则返回 true。
  4. 如果 Type(x) 是 Number,那么
    • 如果 x 是 NaN,则返回 false。
    • 如果 y 是 NaN,则返回 false。
    • 如果 x 与 y 的数值相同,则返回 true。
    • 如果 x 为 +0 且 y 为 -0,则返回 true。
    • 如果 x 为 -0 且 y 为 +0,则返回 true。
    • 返回假。
  5. 如果 Type(x) 是 String,则如果 x 和 y 是完全相同的字符序列(相同的长度和对应位置的相同字符),则返回 true;否则,返回假。
  6. 如果 Type(x) 是布尔值,如果 x 和 y 都为真或都为假,则返回真;否则,返回假。
  7. 如果 x 和 y 引用同一个对象,则返回 true。否则,返回假。

由于您的数组一直到第七步,它们必须是同一个对象,而不仅仅是两个相同的对象。常规相等运算符 ( ==) 也是如此。

于 2013-12-09T15:23:51.273 回答
3

因为每次你写[]你都在调用数组的构造函数。

[]和 Javascript中new Array()的新对象与 equals 方法相比是不同的。见参考资料,new Object()和使用时一样{}

于 2013-12-09T15:14:29.557 回答
2

当您这样做时,[] === []您是在比较参考而不是值(或按值进行深度比较)。

看看这个 javascript 数组比较的解决方案: Comparing two arrays in Javascript

于 2013-12-09T15:20:26.103 回答
1

是的,你是正确的,两个数组文字永远不相等。那是因为它们是对两个单独的数组实例的引用。

描述测试的代码应该写成:

var arr = [];
var result = sortByFoo(arr);
console.log(result === arr && result.length == 0);

检查函数返回的引用是否与传入的引用相同,并且数组仍然为空,确保函数返回相同的数组不变。

于 2013-12-09T15:22:09.870 回答