javascript 为什么相等性检查不能用于数组[duplicate]

wvmv3b1j  于 2023-01-19  发布在  Java
关注(0)|答案(6)|浏览(112)
    • 此问题在此处已有答案**:

How to compare arrays in JavaScript?(60个答案)
(9个答案)
1年前关闭。
我开始说:

"1:2".split(':') == ["1","2"]; 
// false

然后尝试:

[1,2] == [1,2];
// false

最终:

[] == []; 
// false

我后来发现:

"1:2".split(':').toString() == [1,2].toString();
// true

所以我已经解决了我最初的问题(有点),但是为什么数组不能相互匹配呢?

rryofs0p

rryofs0p1#

Javascript数组是对象,你不能简单地使用相等操作符==来了解这些对象的 * 内容 * 是否相同。相等操作符只会测试两个对象是否实际上是完全相同的示例(例如myObjVariable==myObjVariable,也适用于nullundefined)。
如果你需要检查两个数组是否相等,我建议你只遍历两个数组,并验证所有的元素是否有相同的值(以及两个数组是否有相同的长度)。
关于自定义对象的相等性,我会构建一个特定的equals函数,并将其添加到类的原型中。
考虑到最后将两个数组都转换为String并测试结果字符串的相等性,有一天可以考虑使用类似但更通用的技术,您会发现在许多地方都有描述:

JSON.stringify(OBJ1) === JSON.stringify(OBJ2)

好吧,不要
如果属性的顺序对于那些对象示例总是相同的话,这是可行的,但是这会给那些难以追踪的极其讨厌的错误留下隐患。总是倾向于更明确的方法,并且只写一个干净的可读的函数来测试所有必需字段的相等性。

azpvetkf

azpvetkf2#

在Javascript中,对象的==运算符只检查对象是否是相同的实际对象引用,而不是它们是否是包含相同内容的两个独立对象。没有内置运算符来检查它们是否包含相同内容。您必须自己编写一个函数来进行此类比较。
字符串转换是比较两个数组的一种方法,只要数组元素只包含基元值(不包含其他对象)。如果数组元素可以包含其他元素,那么您必须确保这些对象本身也被转换为代表性字符串。
而且,转换为字符串时无法区分包含"4"的数组元素和包含4的数组元素,因为在字符串表示形式中,两者都转换为"4"
仅供参考,您可以阅读关于记录元组的答案,这两种新的数据类型将出现在未来的Javascript中,它将允许通过值来比较数组和对象的不可变版本,而不仅仅是比较它们是否是同一个对象。

7nbnzgx9

7nbnzgx93#

对象的相等性将告诉您这两个对象是否是同一个

var a = [];
var b = a;
a === b;    // True, a and b refer to the same object
[] === [];  // False, two separate objects

您必须循环遍历数组,以查看它们是否具有相同的元素。
参见:How to check if two arrays are equal with JavaScript?

uurity8g

uurity8g4#

在javascript中,每个[]都是window.Array类的一个示例,所以你基本上是在尝试比较两个不同的对象,因为数组可以有任何数量和任何类型的元素,包括对象和自定义对象,而那些嵌套的数组又可以有许多属性和数组等等。
当涉及到比较时,它变得模棱两可,你永远不会确定你想对那些对象和嵌套属性做什么。所以你试图通过比较来达到的目的可以用很多其他的方法来实现。你只需要找出适合你的情况的正确方法。

yzxexxkh

yzxexxkh5#

一种方法是创建自己的Array检查函数:
快!
另一种方法是用.join()Array转换为String,然后比较字符串,再用.split()将它们转换回Array

mfpqipee

mfpqipee6#

如果我把这个问题和Python中的问题联系起来:
输入:

a="1 2 3 4"

案例一:

a=input.split(' ')

输出:["1","2","3","4"]
案例二:

a=map(int,input.split(' '))

输出:[1,2,3,4]
因此,错误是类型的错误,因为它可能会为以下情况得出aa 'true':

"1:2".split(':').toString() == [1,2].toString(); //true

相关问题