为什么或者如何证明JavaScript数组相等?
中有一个简单的函数,它将为包含基元值的数组返回数组相等 然而,我不知道为什么它会起作用。以下是函数:为什么或者如何证明JavaScript数组相等?,javascript,arrays,equality,Javascript,Arrays,Equality,中有一个简单的函数,它将为包含基元值的数组返回数组相等 然而,我不知道为什么它会起作用。以下是函数: function arrays_equal(a,b) { return !!a && !!b && !(a<b || b<a); } 函数数组_equal(a,b){return!!a&&&!!b&&!(a对于,数组首先转换为字符串,因此不能提供可靠的相等性检查方法 =不起作用,因为对象是通过引用检查的: [] == []; // false, tw
function arrays_equal(a,b) { return !!a && !!b && !(a<b || b<a); }
函数数组_equal(a,b){return!!a&&&!!b&&!(a对于
,数组首先转换为字符串,因此不能提供可靠的相等性检查方法
=
不起作用,因为对象是通过引用检查的:
[] == []; // false, two separate objects
var a = [];
a == a; // true, refer to the same object
技巧有缺陷:
var a = [1, [2, 3]],
b = [[1, 2], 3];
!(a<b || b<a); // true
var a=[1,2,3]],
b=[[1,2,3];
!(a您可以使用=
来比较任意两个对象。但是,由于>和<不是为对象定义的,它们被转换为字符串。因此,[1,2,3]>[2,1,3]
实际上是在做“1,2,3”>“2,1,3”
然而,我不知道为什么它会起作用
它不起作用,想想看
arrays_equal(["1,2"], [1,2])
即使根据基于元素比较的数组相等性的任何定义,它们都是不同的,也会生成true
arrays_equal([[]], [])
及
也都是假阳性
简单地添加length
检查不会有帮助,如
arrays_equal(["1,2",3], [1,"2,3"])
arrays_equal(
["",","],
[",",""])
编辑:
如果您想要一种简洁的方法来测试结构相似性,我建议:
function structurallyEquivalent(a, b) {
return JSON.stringify(a) === JSON.stringify(b);
}
对于明显不同的输入,它不会提前停止——它会遍历两个对象图,不管它们有多不相似,但OP中的函数也是如此
一个警告:当您使用非本机的JSON.stringify
时,它可能会对循环输入执行一些奇怪的操作,例如:
var input = [];
input[0] = input;
一个更可靠的替代方案可能是JSON.stringify(A)=JSON.stringify(b)
@gilly:True,除非数组。@gilly3:也会有其他问题。JSON.stringify([function(){}])==JSON.stringify([,])//True
@Heera啊,我错过了这一点——我不知道这些代码是怎么回事:)是的,你是正确的,但是注意逗号也在字符串中。总之,考虑一个更简单的例子:<代码>“1”>“2”。
为false,因为49>50
为false。同样,情况正好相反。这些参数的要点基本上是不能将这样简单的函数用作通用实用函数。但是,从更实际的角度来看,如果数组的格式已知(例如,比较两个简单的字符串数组)这样的函数当然是足够的。即使对于图元,<代码> JSON。StrugInt[/Cord] >可能不是完全可靠的。请考虑<代码> []、和<代码> [NULL ]。
@pimvdb,当然。它将null
和undefined
/elipsis合并在一起,但JavaScript==
也是如此。OP中没有任何内容表示对===
的偏好超过=
。谢谢,您的回答与@pimvdb一起进一步帮助了我的理解。这是不正确的。转换不总是字符串。指定对象转换使用类型提示“number”
进行,因此数组等于(新日期(1),1)
为true
。谢谢;感谢Mike在评论中的澄清!
function structurallyEquivalent(a, b) {
return JSON.stringify(a) === JSON.stringify(b);
}
var input = [];
input[0] = input;