查看此代码示例or go to the 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
。第二个输出{{1}}。谁能解释这种行为?如何在javascript中有效地比较数组?
答案 0 :(得分:25)
您可以使用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
答案 1 :(得分:12)
答案 2 :(得分:7)
数组是javascript中的对象。与比较字符串或数字时通常使用的==
无法比较对象。
还有很多其他比较数组的方法,我最喜欢的是使用JSON:
if ( JSON.stringify(a) == JSON.stringify(b) ) {
// equal
请注意,将预先存在的对象分配给变量就像在编写b = a
时一样,只是复制引用。它们都指向同一个数组。
您必须b = a.slice()
才能获得真实副本。
答案 3 :(得分:2)
您可以编写自己的比较函数,根据您的需要,检查长度是否相同以及元素是否相同(无论是否顺序)。 编辑正如其他人所指出的,有几个库包含数组比较函数。如果你发现一个符合你的“平等”定义(并非不可能),并且你不介意考虑将该库纳入你的架构,那可能是个好主意。