为什么不使用等式检查数组

Jac*_*nkr 34 javascript

我开始时:

"1:2".split(':') == ["1","2"]; 
// false
Run Code Online (Sandbox Code Playgroud)

然后尝试:

[1,2] == [1,2];
// false
Run Code Online (Sandbox Code Playgroud)

最终:

[] == []; 
// false
Run Code Online (Sandbox Code Playgroud)

我发现了:

"1:2".split(':').toString() == [1,2].toString();
// true
Run Code Online (Sandbox Code Playgroud)

所以我已经解决了我的初始问题(种类),但为什么数组不能相互匹配?

Umb*_*ndi 35

Javascript数组是对象,您不能简单地使用相等运算符==来理解这些对象的内容是否相同.等于运算符将仅测试两个对象实际上是否完全相同(例如myObjVariable==myObjVariable,适用于nullundefined也是如此).

如果你需要检查两个数组是否相等,我建议只遍历两个数组并验证所有元素是否具有相同的值(并且两个数组的长度相同).

关于自定义对象的相等性,我会构建一个特定的equals函数,然后将它添加到类的原型中.

考虑到最终你将两个数组转换为String测试结果字符串的相等性,你有一天可能会考虑使用一个类似但更通用的技术,你会发现它在很多地方描述:

JSON.stringify(OBJ1) === JSON.stringify(OBJ2) 
Run Code Online (Sandbox Code Playgroud)

好吧,不要.

虽然如果属性的顺序对于那些对象实例总是相同的,这可能会起作用,但是这样就可以打开那些难以追踪的非常讨厌的错误.总是喜欢更明确的方法,只需编写一个干净且可读的函数来测试相等性检查所有必需的字段.


jfr*_*d00 10

==用于在JavaScript对象操作者仅检查是否该对象是相同的实际对象引用,而不是如果它们包含相同内容的两个单独的对象.没有内置运算符来检查它们是否包含相同的内容.您必须自己编写一个函数来进行这种比较.

只要数组元素只包含原始值(而不是其他对象),您的字符串转换就是比较两个数组的一种方法.如果数组元素可以包含其他元素,那么您必须确保这些对象本身也转换为代表性字符串.

并且,转换为字符串不会在包含的数组元素与包含的数组元素之间分辨"4",4因为两者都转换为"4"字符串表示形式.


Geo*_*lah 6

数组是JavaScript中的对象,通过引用传递.这意味着当我初始化一个数组时:

var array = [1, 2, 3];
Run Code Online (Sandbox Code Playgroud)

我在内存中创建了对该数组的引用.如果我然后说:

var otherArray = [1 2, 3];
Run Code Online (Sandbox Code Playgroud)

array和otherArray在内存中有两个独立的地址,因此它们不会相等(即使值相等.)要测试引用的传递,您可以通过执行以下操作来解决数组:

var copyArray = array;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,copyArray在内存中引用与数组相同的地址,因此:

copyArray === array; //will evaluate to true
array.push(4); //copyArray will now have values [1, 2, 3, 4];
copyArray.push(5); //array will have values [1, 2, 3, 4, 5];
copyArray === array; //still true
Run Code Online (Sandbox Code Playgroud)

为了测试数组或对象中值的相等性,您需要进行"深度比较" - 对于数组,这将遍历两个数组以比较索引和值以查看两者是否相等 - 对于对象,它将遍历每个键并使确定价值是一样的.有关深度比较的更多信息,您可以查看underscore.js注释源:

http://underscorejs.org/docs/underscore.html


归档时间:

查看次数:

19606 次

最近记录:

6 年,5 月 前