3

有人可以描述这些表达的结果吗?

  [1, 2, 4] < [1, 2, 5]  // true
  [1, 3, 4] < [1, 2, 5]  // false


  [1, 2, 3] === [1, 2, 3]   // false
  [1, 2, 3] <   [1, 2, 3]   // false
  [1, 2, 3] ==  [1, 2, 3]   // false
  [1, 2, 3] >   [1, 2, 3]   // false


  [1, 2, 3] <= [1, 2, 3]   // true
  [1, 2, 3] >= [1, 2, 3]   // true

感谢您的帮助和快速答复!

4

4 回答 4

4

平等 =

[1, 2, 3] == [1, 2, 3]

The Abstract Equality Comparison Algorithm下进行了描述,它基本上说

(if x or y are primitives, compare them, otherwise...)
Return true if x and y refer to the same object. Otherwise, return false.

由于不同的对象字面量总是代表不同的对象,即使内容相同,上面的比较也会失败。

关系运算符 < >

相对比较不同于相等。当您使用<or>时,数组将作为字符串进行比较。

[1, 2, 4] < [1, 2, 5] 

抽象关系比较算法将两个操作数都转换为原语。如果操作数是对象,则ToPrimitive调用[[DefaultValue]]which 又与obj.valueOf().toString(). 由于valueOf对象就是对象本身,所以整个事情归结为

"1,2,4" < "1,2,5"

数组按元素进行比较的常见假设是不正确的:

[10,1,3] < [101,5]  // false

请注意,valueOf可以重写以影响关系运算符的行为:

> a = [1,2,3]
[1, 2, 3]
> a < [1,2,4]
true
> a.valueOf = function() { return 'zzz' }
function () { return 'zzz' }
> a < [1,2,4]
false
于 2013-05-15T14:04:33.490 回答
3

在 JavaScript 中,几乎所有东西都是对象。有一些原始类型可以根据需要在原始版本和对象版本之间自动装箱。

当您在 JavaScript 中比较对象时,您实际上是在比较它们是否是相同的引用(例如,指向相同的内存地址)。证明在这里

 var a = [1, 2, 3];
 b = a;
 b.push(5);
 console.log(a); // 1, 2, 3, 5

在这种情况下a == bora === b将屈服true。如果我想比较两个单独的数组,那么我需要遍历它们并逐个元素地比较。

在以下情况下,我可以使用一个技巧。现场演示

var x = [1, 2, 3];
var y = [1, 2, 4];
var z = [1, 2, 3];
var equals = x.join("").localeCompare(y.join("")) == 0; //x with y
var equals2 = x.join("").localeCompare(z.join("")) == 0; //x with z
document.body.innerHTML += equals + "<br />";
document.body.innerHTML += equals2 + "<br />";

在你奇怪的情况下

Array([],null,undefined,null) == ",,,";

在 JavaScript 中,==运算符将执行它可以执行的所有类型转换/转换以检查相等性。它将尝试将 aString与进行比较String,此时左侧的ArrayString使用简单的toString()调用转换为 a!

这里,我想答案现在很明显了。

于 2013-05-15T13:53:24.900 回答
1
[1, 2, 3] === [1, 2, 3]   // false
[1, 2, 3] ==  [1, 2, 3]   // false

数组是 JavaScript 中的对象,因此通过引用进行比较(无论是严格相等还是类型转换相等)。两个不同的(即使相似的)文字总是评估为不同的对象,它们永远不会相等。引用规范,

[如果xy都属于 类型Object,则]返回trueifxy引用同一个对象。否则,返回false


[1, 2, 4] < [1, 2, 5]   // true
…

JavaScript 的比较运算符总是将它们的参数转换为原始值(如果需要,然后转换为字符串或数字)。在 objects 上.valueOf(),首先.toString()尝试。数组将变为字符串化,并且对于您的简单示例"1,2,4"确实小于"1,2,5". 它不适用于复杂的对象、包含逗号的字符串,甚至对于[12]vs [2]

于 2013-05-15T13:54:16.873 回答
0

这就是指定相等算法的方式(第 11.9.3 节):

比较 x == y,其中 x 和 y 是值,产生真或假。如下进行这样的比较:

  1. 如果Type(x)与 相同Type(y),则
    • [...]
    • 返回trueifxy引用同一个对象。否则,返回false

所以以下将返回 true 并且所有其他相等比较将返回 false

var x = [1,2,3];
return x == x;
于 2013-05-15T13:53:33.657 回答