我开始于:
"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
函数,并将其添加到您的类的原型中。
考虑到最后您将两个数组都转换为 aString
并测试了结果字符串的相等性,有一天您可以考虑使用一种类似但更通用的技术,您会在多个地方找到描述:
JSON.stringify(OBJ1) === JSON.stringify(OBJ2)
好吧,不要。
虽然如果这些对象实例的属性顺序始终相同,这可能会起作用,但这为可能难以追踪的极其讨厌的错误敞开了大门。始终支持更明确的方法,只需编写一个干净易读的函数,该函数将测试所有必需字段的相等性。
==
Javascript 中对象的运算符只检查对象是否是相同的实际对象引用,而不是它们是否是包含相同内容的两个单独对象。没有内置运算符来检查它们是否包含相同的内容。您必须编写一个函数来自己进行这种比较。
只要数组元素只包含原始值(不包含其他对象),字符串转换就是比较两个数组的一种方式。如果数组元素可以包含其他元素,那么您必须确保这些对象本身也被转换为有代表性的字符串。
并且,转换成字符串不会包含数组元素之间辨别"4"
与一个包含4
由于两个转换到"4"
在字符串表示。
数组是 JavaScript 中通过引用传递的对象。这意味着当我初始化一个数组时:
var array = [1, 2, 3];
我在内存中创建了对该数组的引用。如果我接着说:
var otherArray = [1, 2, 3];
array 和 otherArray 在内存中有两个单独的地址,因此它们不会彼此相等(即使值相等。)要测试通过引用传递,您可以通过执行以下操作来使用数组:
var copyArray = array;
在这种情况下,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
为了测试数组或对象中值的相等性,您需要进行“深度比较”-对于数组,这将遍历两个数组以比较索引和值以查看两者是否相等-对于对象,它将遍历每个键并使确定值是一样的。有关深度比较的更多信息,您可以查看 underscore.js 注释源:
在javascript中,每个[]
都是window.Array
类的一个实例。所以你基本上是在尝试比较两个不同的对象。由于数组可以有任何没有。任何类型的元素,包括对象和自定义对象,以及那些嵌套数组都可以再次拥有众多属性和数组等。
比较时会变得模棱两可,您永远无法确定要对这些对象和嵌套属性做什么。因此,您尝试通过比较实现的目标可以通过许多其他方式完成。您只需要为您的案例找出正确的方法。
对象的相等性将告诉您两个对象是否相同。
var a = [];
var b = a;
a === b; // True, a and b refer to the same object
[] === []; // False, two separate objects
您必须遍历数组以查看它们是否具有相同的元素。