10

查看此代码示例或转到 jsfiddle

function printRelation(a, b, out) {
    var text;
    if (a === b) {
        text = "a === b";
    } else if (a == b) {
        text = "a == b";
    } else {
        text = "a != b";
    }
    $('#' + out).text(text);
}

var a = [0, 0, 2], b = a;
printRelation(a, b, 'out1');
a = [0, 0, 2];
b = [0, 0, 2];
printRelation(a, b, 'out2');

我本来希望这两个测试都能输出a === b,但只有第一个可以。第二个输出a != b。谁能解释这种行为?如何有效地比较javascript中的数组?

4

4 回答 4

26

您可以使用 Underscore.js 库的 isEqual 方法。

http://underscorejs.org/#isEqual

在两个对象之间执行优化的深度比较,以确定它们是否应该被视为相等。

var moe   = {name : 'moe', luckyNumbers : [13, 27, 34]};
var clone = {name : 'moe', luckyNumbers : [13, 27, 34]};
moe == clone;
=> false
_.isEqual(moe, clone);
=> true

更新

Lodash 的灵感来自下划线,但现在是更好的解决方案

https://lodash.com/docs/#isEqual

在两个对象之间执行优化的深度比较,以确定它们是否应该被视为相等。

var object = { 'a': 1 };
var other = { 'a': 1 };

_.isEqual(object, other);
// => true

object === other;
// => false
于 2012-10-07T16:05:19.390 回答
12

使用lodash

_.isEqual([1,2],[1,2])

也适用于对象。

_.isEqual({a:1}, {a:1})
于 2012-10-07T16:10:36.523 回答
7

数组是javascript中的对象。并且不能==像比较字符串或数字时通常使用的那样比较对象。

还有很多其他方法可以比较数组,我最喜欢的是使用 JSON:

if ( JSON.stringify(a) == JSON.stringify(b) ) {
    // equal

请注意,像在编写时那样将预先存在的对象分配给变量b = a只是复制引用。它们都指向同一个数组。

您必须做b = a.slice()才能获得真正的副本。

于 2012-10-07T16:00:37.800 回答
2

像您编写的 JavaScript 数组比较只是简单的对象引用比较。它们不是逐个元素的“深度”比较。

您可以编写自己的比较函数,以检查长度是否相同且元素是否相同,无论是否按顺序,都符合您的需要。编辑正如其他人指出的那样,有几个库包含数组比较函数。如果您找到一个符合您对“平等”的定义(并非不可能),并且您不介意考虑将该库合并到您的架构中,那可能是一个好主意。

于 2012-10-07T16:00:28.050 回答