我开始于:
"1:2".split(':') == ["1","2"];
// false
然后尝试:
[1,2] == [1,2];
// false
最终目标是:
[] == [];
// false
我后来发现:
"1:2".split(':').toString() == [1,2].toString();
// true
所以我解决了我最初的问题(有点),但为什么数组不能相互匹配?
我开始于:
"1:2".split(':') == ["1","2"];
// false
然后尝试:
[1,2] == [1,2];
// false
最终目标是:
[] == [];
// false
我后来发现:
"1:2".split(':').toString() == [1,2].toString();
// true
所以我解决了我最初的问题(有点),但为什么数组不能相互匹配?
JavaScript数组是对象,您不能简单地使用相等运算符==
来判断这些对象的内容是否相同。相等运算符只会测试两个对象是否实际上是完全相同的实例(例如myObjVariable == myObjVariable
,对于null
和undefined
也适用)。
如果您需要检查两个数组是否相等,我建议只需遍历这两个数组并验证所有元素具有相同的值(以及两个数组具有相同的长度)。
关于自定义对象的相等性,我会构建一个特定的equals
函数,并将其添加到类的原型中。
考虑到最后您将两个数组都转换为String
并测试结果字符串的相等性,您可能有一天可以考虑使用一种类似但更通用的技术,您会发现在许多地方都有描述:
JSON.stringify(OBJ1) === JSON.stringify(OBJ2)
好的,不要这样做。
虽然如果对象实例的属性顺序始终相同,这可能有效,但是这会为极其棘手的错误留下漏洞,这些错误可能难以追踪。始终倾向于更明确的方法,只需编写一个干净且易读的函数,即可测试所有必需字段的相等性。
myObjVariable = NaN
的所有JS实例中,myObjVariable == myObjectVariable
都是成立的... :) - War10ckNaN.constructor === Number
。 - Dmytro==
运算符仅检查对象是否为同一实际对象引用,而不是它们是否是包含相同内容的两个单独的对象。没有内置运算符来检查它们是否包含相同的内容。您需要编写一个函数来执行这种比较。"4"
和包含4
的数组元素,因为两者在字符串表示中都会转换为"4"
。对象的相等性将告诉您两个对象是否是同一个。
var a = [];
var b = a;
a === b; // True, a and b refer to the same object
[] === []; // False, two separate objects
[]
都是window.Array
类的一个实例。因此,您基本上是在尝试比较两个不同的对象。由于数组可以具有任何数量和任何类型的元素,包括对象和自定义对象,那些嵌套的数组又可以具有众多属性和数组等等。有一种方法是创建自己的Array
检查函数:
另一种方法是使用.join()
将Array
转换为String
,并比较字符串。然后使用.split()
将它们再转回Array
。
如果我将这个问题与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
==
和===
都不会进行逐个元素的比较,它们只会检查两个数组是否完全相同。 - thefourtheye[1,2,3]
不等于它本身? - Bergiarray.length === 0
。 - nCardot