为什么数组不能使用相等检查?

56

我开始于:

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

然后尝试:

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

最终目标是:

[] == []; 
// false

我后来发现:

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

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


4
=====都不会进行逐个元素的比较,它们只会检查两个数组是否完全相同。 - thefourtheye
2
这是因为在JavaScript中,数组是对象。你可能想看一下这个链接:https://dev59.com/3mEh5IYBdhLWcg3wbjLc - ankur
1
可能是重复的问题:为什么在Javascript中[1,2,3]不等于它本身? - Bergi
请注意,如果您只想检查一个空数组,可以检查 array.length === 0 - nCardot
6个回答

60

JavaScript数组是对象,您不能简单地使用相等运算符==来判断这些对象的内容是否相同。相等运算符只会测试两个对象是否实际上是完全相同的实例(例如myObjVariable == myObjVariable,对于nullundefined也适用)。

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

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

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

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

好的,不要这样做。

虽然如果对象实例的属性顺序始终相同,这可能有效,但是这会为极其棘手的错误留下漏洞,这些错误可能难以追踪。始终倾向于更明确的方法,只需编写一个干净且易读的函数,即可测试所有必需字段的相等性。


有趣的一点是,在除了myObjVariable = NaN的所有JS实例中,myObjVariable == myObjectVariable都是成立的... :) - War10ck
1
有许多关于NaN的有趣注释,其中最著名的之一是 NaN.constructor === Number - Dmytro

14
在JavaScript中,对象的==运算符仅检查对象是否为同一实际对象引用,而不是它们是否是包含相同内容的两个单独的对象。没有内置运算符来检查它们是否包含相同的内容。您需要编写一个函数来执行这种比较。
将数组转换为字符串可以比较两个数组,只要数组元素只包含原始值(而不是其他对象)。如果数组元素可能包含其他元素,则必须确保这些对象本身也被转换为代表字符串。
将其转换为字符串将无法区分包含"4"和包含4的数组元素,因为两者在字符串表示中都会转换为"4"
FYI,您可以在此答案中了解有关JavaScript即将推出的两种新数据类型记录元组的信息,它们将允许通过值比较不可变的数组和对象,而不仅仅是比较它们是否为相同的对象。

4

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

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

你需要遍历数组,以查看它们是否具有相同的元素。
参见:如何使用JavaScript检查两个数组是否相等?

2
在JavaScript中,每个[]都是window.Array类的一个实例。因此,您基本上是在尝试比较两个不同的对象。由于数组可以具有任何数量和任何类型的元素,包括对象和自定义对象,那些嵌套的数组又可以具有众多属性和数组等等。
当涉及到比较时,它变得模糊不清,您永远不会确定您想要对这些对象和嵌套属性做什么。因此,通过比较所要实现的目标可以用许多其他方式来完成。您只需要找出适合您情况的正确方法即可。

1

有一种方法是创建自己的Array检查函数:

如何在JavaScript中比较数组?

另一种方法是使用.join()Array转换为String,并比较字符串。然后使用.split()将它们再转回Array


-2

如果我将这个问题与Python中的问题联系起来:

输入:

a="1 2 3 4"

案例 I:

a=input.split(' ')

输出:['1','2','3','4']

情况二:

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

输出:[1, 2, 3, 4]

因此,故障是类型的问题,因为它可能会对以下情况产生“true”:

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

请分享更多细节。由于这个问题涉及到Javascript,你的回答与它有什么关系? - Nico Haase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接