为什么[1,2,3]在Javascript中不等于它自己?

Pet*_*son 11 javascript

我今天在Javascript中玩数组并注意到这个小宝石:

alert([1, 2, 3] == [1, 2, 3]); //alerts false
Run Code Online (Sandbox Code Playgroud)

令我感到奇怪的是阵列不等于它自己.

但后来我注意到了这一点,甚至更奇怪了:

alert([1, 2, 3] == "1,2,3");  //alerts true
Run Code Online (Sandbox Code Playgroud)

?!?!?!?!?

世界上为什么[1, 2, 3]不是==自己而是==弦乐?

我认识到,==是不一样的===.即便如此,邪恶可能会导致Javascript先生做出如此奇怪的事情?

riw*_*alk 18

好的,首先你需要了解javascript如何处理程序中的值.您创建的所有变量仅仅是对存储该对象的内存中的位置的引用.因此,当你这样做:

alert( [1,2,3] == [1,2,3] );
Run Code Online (Sandbox Code Playgroud)

......它做了三件事:

  1. 将数组([1,2,3])放在堆上
  2. 将另一个数组([1,2,3])放到堆上(注意它将具有不同的内存位置)
  3. 比较两个参考.它们指向内存中不同位置的不同对象,因此它被认为是不相等的.

您可以通过运行以下代码来检查一些理智的行为:

var a = [1,2,3];
var b = a;
alert (a == b)   // Result is true. Both point to the same object.
Run Code Online (Sandbox Code Playgroud)

现在关于字符串的问题

当你使用==运算符尝试将两个操作数转换为相同的类型(邪恶的行为......我知道......)

当它执行此操作时,它决定在进行比较之前将两者都转换为字符串(因此结果确实是"1,2,3" === "1,2,3",其结果为true.

我不能给你一个完整的图片,因为很少有人了解JavaScript的疯狂的每一个细微差别,但希望这清除了一些迷雾.

  • @nnnnnn,等等,复制了错误的例子(深夜).打破传递性的例子是:''0'== 0`为真,'''== 0`为真,但''0'==''为假.令人惊讶的是反直觉. (4认同)
  • `==`没有邪恶的行为,它有明确定义的行为,在这种情况下,没有你从'===`得到的帮助.或许它更有帮助:它真的取决于你想要做什么. (3认同)
  • @nnnnnn,它具有*反直觉*行为,因此它是邪恶的.上面的例子揭示了`=='的一些邪恶本质,但不是全部.例如,`false == undefined`为false,`false == null`为false,但是`null == undefined`为真.它定义明确,但完全违反直觉(如果传递性是"正确"的基础,那么结果就是错误的.) (3认同)

dec*_*eze 6

== 操作员

[..] 如果任一操作数是字符串,则如果可能,另一个操作数将转换为字符串。[..] 如果两个操作数都是对象,那么当操作数引用内存中的同一对象时,JavaScript 会比较相等的内部引用。

https://developer.mozilla.org/en/JavaScript/Reference/Operators/Comparison_Operators

也就是说,[1, 2, 3]转换为字符串equals "1,2,3"。但是,一个数组对象不等于另一个数组对象。