Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么或者如何证明JavaScript数组相等?_Javascript_Arrays_Equality - Fatal编程技术网

为什么或者如何证明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;