【问题标题】:[] is not identical to [] [duplicate][] is not identical to [] [duplicate]
【发布时间】:2013-12-26 18:13:29
【问题描述】:

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

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

但我已经尝试过:

[] === [];
>> false

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

请原谅我大概的英语,它不是我的母语:p

【问题讨论】:

  • 一个空数组和另一个空数组不一样,它们是两个不同的数组?
  • [].__proto__ === [].__proto__ 虽然是true :-)
  • @qwertynl [].__proto__ === [1].__proto__

标签: javascript arrays empy


【解决方案1】:

如果您查看 javascript/ecmascript 的规范,尤其是 section 11.9.6,您将看到如何与 === 进行比较。

严格等式比较算法

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

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

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

【讨论】:

  • [off topc] 你为什么批准the edit mentioned here?它应该被拒绝
  • 我快速阅读了编辑内容,它看起来很合理,但正如 Meta 上提到的 rene 所言,我对这些特定标签没有太多经验。
  • 好的,那么请在审核时更加小心。 (当您不确定并且没有太多经验时,请使用 Skip。)谢谢!
【解决方案2】:

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

[]new Array() 相同,而 Javascript 中的 new 对象与 equals 方法相比是不同的。见reference, 使用{} 时与new Object() 相同。

【讨论】:

    【解决方案3】:

    当您执行[] === [] 时,您是在比较引用而不是值(或按值进行深度比较)。

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

    【讨论】:

    • 顺便说一句,[]==[] 也是如此。
    【解决方案4】:

    是的,你说得对,两个数组字面量永远不相等。那是因为它们是对两个单独的数组实例的引用。

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

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

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

    【讨论】:

    • 只有当sortByFoo返回它提供的数组时才有效。
    • @Stilltorik:是的,而且函数没有理由返回一个新数组。
    • 这真的取决于规格。如果它直接修改提供的数组,您将失去原始顺序。它可能会或可能不会被接受。
    • @Stilltorik:即使排序后的数组应该作为一个新数组返回,在它没有改变的情况下仍然没有理由创建一个新数组。
    • @Guffa 客户端代码可能取决于 .sort 不能就地工作并通常返回一个新数组的事实......我会说没有理由创建一个特殊情况时创建一个数组是如此便宜。
    猜你喜欢
    • 2017-06-22
    • 2012-05-14
    • 2022-12-01
    • 2013-07-03
    • 2016-06-20
    • 2022-12-02
    • 2018-02-16
    • 1970-01-01
    • 2016-05-08
    相关资源
    最近更新 更多