为什么或如何证明JavaScript数组相等?

Bil*_*son 8 javascript arrays equality

这个答案中,有一个简单的函数将返回包含原始值的数组的数组相等性.

但是,我不确定它为什么会起作用.这是功能:

function arrays_equal(a,b) { return !!a && !!b && !(a<b || b<a); }
Run Code Online (Sandbox Code Playgroud)

我对下半场最感兴趣; 这一点:

!(a<b || b<a)
Run Code Online (Sandbox Code Playgroud)

为什么<>比较数组时工作,但==不?

如何在JavaScript中使用少于和多于方法?

pim*_*vdb 11

使用</ >,数组首先转换为字符串,因此不提供检查相等性的可靠方法.

== 不起作用,因为通过引用检查对象:

[] == []; // false, two separate objects

var a = [];
a == a; // true, refer to the same object
Run Code Online (Sandbox Code Playgroud)

</ >诀窍是有缺陷的:

var a = [1, [2, 3]],
    b = [[1, 2], 3];

!(a<b || b<a); // true
Run Code Online (Sandbox Code Playgroud)

这个求值为true,因为它们"1,2,3"在被检查之前都被转换为字符串(</ >不"直接"用于对象).

所以基本上,你要比较字符串的相等性.对于字符串,a == b确实与!(a<b || b<a)- </ >对于字符串检查字符代码相同,因此两个相等的字符串既不"小"也不"大",因为字符串中的任何字符代码都不是这种情况.

  • 大多数这些论点的要点基本上是你不能使用像这样简单的通用实用函数.但是,从更实际的角度来看,如果您的数组采用已知格式(例如,比较两个简单的字符串数组),那么这样的函数肯定是足够的. (2认同)

Mik*_*uel 5

但是,我不确定它为什么会起作用.

它不起作用.考虑

arrays_equal(["1,2"], [1,2])
Run Code Online (Sandbox Code Playgroud)

即使通过基于元素比较的任何数组相等定义,它们也会生成true,它们是不同的.

arrays_equal([[]], [])
Run Code Online (Sandbox Code Playgroud)

arrays_equal([""], [])
Run Code Online (Sandbox Code Playgroud)

也是虚假的积极因素.

简单地添加length检查无助于证明

arrays_equal(["1,2",3], [1,"2,3"])

arrays_equal(
    ["",","],
    [",",""])
Run Code Online (Sandbox Code Playgroud)

编辑:

如果你想要一种简洁的方法来测试结构相似性,我建议:

function structurallyEquivalent(a, b) {
  return JSON.stringify(a) === JSON.stringify(b);
}
Run Code Online (Sandbox Code Playgroud)

它不会在明显不同的输入上提前停止 - 无论它们有多么不同,它都会遍历两个对象图,但OP中的功能也是如此.

一个警告:当你使用非本机时JSON.stringify,它可能会为循环输入做一些奇怪的事情,例如:

var input = [];
input[0] = input;
Run Code Online (Sandbox Code Playgroud)