Sha*_*awn 9 javascript arrays comparison
看看这个代码示例或转到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');
Run Code Online (Sandbox Code Playgroud)
我本来期望两个测试都输出a === b,但只有第一个输出.第二个输出a != b.谁能解释这种行为?如何在javascript中有效地比较数组?
RKu*_*her 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
Run Code Online (Sandbox Code Playgroud)
Lodash的灵感来自下划线,但现在是卓越的解决方案
https://lodash.com/docs/#isEqual
在两个对象之间执行优化的深度比较,以确定它们是否应被视为相等.
var object = { 'a': 1 };
var other = { 'a': 1 };
_.isEqual(object, other);
// => true
object === other;
// => false
Run Code Online (Sandbox Code Playgroud)
Ste*_*all 12
使用lodash.
_.isEqual([1,2],[1,2])
Run Code Online (Sandbox Code Playgroud)
也适用于对象.
_.isEqual({a:1}, {a:1})
Run Code Online (Sandbox Code Playgroud)
数组是javascript中的对象.并且比较对象不能==像使用比较字符串或数字时通常使用的那样进行.
还有很多其他比较数组的方法,我最喜欢的是使用JSON:
if ( JSON.stringify(a) == JSON.stringify(b) ) {
// equal
Run Code Online (Sandbox Code Playgroud)
请注意,将预先存在的对象分配给变量就像在写入时一样,b = a只是复制引用.它们都指向同一个数组.
你需要做b = a.slice()一个真正的副本.
像您编写的 JavaScript 数组比较只是简单的对象引用比较。它们不是逐个元素的“深度”比较。
您可以编写自己的比较函数,用于检查长度是否相同以及元素是否相同(无论是否按顺序),以满足您的需要。编辑正如其他人指出的那样,有几个库包含数组比较函数。如果您找到一个符合您对“平等”定义的库(并非不可能),并且您不介意考虑将该库合并到您的架构中,那么这可能是一个好主意。