我被要求在Javascript中编写一个函数sortByFoo,它会对此测试做出正确的反应:
// Does not crash on an empty array
console.log(sortByFoo([]) === []);
但我尝试了一些事情:
[] === [];
>> false
这样我可以肯定,这样的测试总会失败,无论sortByFoo函数如何,都不会吗? 但我想解释为什么会发生这种情况。为什么[]不等于[]?
请原谅我的近似英语,这不是我的母语:p
答案 0 :(得分:4)
如果你看一下javascript / ecmascript的规范,特别是section 11.9.6,你会看到如何与===
进行比较。
严格的等式比较算法
比较x === y,其中x和y是值,产生true或false。这样的比较如下进行:
- 如果Type(x)与Type(y)不同,则返回false。
- 如果Type(x)为Undefined,则返回true。
- 如果Type(x)为Null,则返回true。
- 如果Type(x)是Number,那么
- 如果x为NaN,则返回false。
- 如果y为NaN,则返回false。
- 如果x与y的数字值相同,则返回true。
- 如果x为+0且y为-0,则返回true。
- 如果x为-0且y为+0,则返回true。
- 返回false。
- 如果Type(x)是String,则如果x和y完全相同的字符序列(相应位置的长度和字符相同),则返回true;否则,返回false。
- 如果Type(x)是布尔值,如果x和y都为true或两者都为false,则返回true;否则,返回false。
- 如果x和y引用同一个对象,则返回true。否则,返回false。
醇>
由于你的数组一直到第七步,它们必须是同一个对象,而不仅仅是两个相同的对象。对于常规等式运算符(==
)也是如此。
答案 1 :(得分:3)
因为每次编写[]
时都会调用数组的构造函数。
[]
与new Array()
相同,在Javascript中,与equals方法相比较的新对象不同。使用new Object()
时,请reference,与{}
相同。
答案 2 :(得分:2)
执行[] === []
时,您要比较参考而不是值(或按值进行深度比较)。
看一下这个javascript数组比较解决方案:Comparing two arrays in Javascript
答案 3 :(得分:1)
是的,你是对的,两个数组文字永远不会相等。那是因为它们引用了两个独立的数组实例。
应该写下描述测试的代码:
var arr = [];
var result = sortByFoo(arr);
console.log(result === arr && result.length == 0);
检查函数返回的引用是否与发送的引用相同,并且该数组仍然为空,确保该函数返回相同的数组不变。