为什么相等检查不适用于数组

IT技术 javascript
2021-01-28 13:31:04

我开始于:

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

然后尝试:

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

并最终:

[] == []; 
// false

我后来发现:

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

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

6个回答

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

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

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

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

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

好吧,不要

虽然如果这些对象实例的属性顺序始终相同,这可能会起作用,但这为可能难以追踪的极其讨厌的错误敞开了大门。始终支持更明确的方法,只需编写一个干净易读的函数,该函数将测试所有必需字段的相等性。

有趣的是,myObjVariable == myObjectVariable在所有 JS 实例中都是如此,除了 where myObjVariable = NaN... :)
2021-03-22 13:31:04
有许多关于 NaN 的有趣注释,其中最著名的是NaN.constructor === Number
2021-04-06 13:31:04

==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 注释源:

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

“通过引用传递”是函数调用中参数的一个属性(它在 JavaScript 中不存在)。这里没有函数调用。
2021-03-28 13:31:04

在javascript中,每个[]都是window.Array类的一个实例所以你基本上是在尝试比较两个不同的对象。由于数组可以有任何没有。任何类型的元素,包括对象和自定义对象,以及那些嵌套数组都可以再次拥有众多属性和数组等。

比较时会变得模棱两可,您永远无法确定要对这些对象和嵌套属性做什么。因此,您尝试通过比较实现的目标可以通过许多其他方式完成。您只需要为您的案例找出正确的方法。

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

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

您必须遍历数组以查看它们是否具有相同的元素。

请参阅:如何使用 JavaScript 检查两个数组是否相等?