比较在Coffeescript/Javascript和Ruby中给出了不同的结果

比较在Coffeescript/Javascript和Ruby中给出了不同的结果,javascript,ruby,coffeescript,Javascript,Ruby,Coffeescript,例如: [42] == [42] 比较结果给出了不同的结果: CS/JS: false Ruby: true 另一方面: 42 == 42 42 == 42 给出了结果: CS/JS: true Ruby: true 这背后的原因是什么?在JavaScript中,数组是通过引用而不是通过值进行比较的[42]和[42]是不同的实体(尽管是彼此的克隆体),因此不相等 不幸的是,42是所有问题的答案这一事实与此无关。在JavaScript中,数组是通过引用而不是通过值进行比较的[42]和

例如:

[42] == [42]
比较结果给出了不同的结果:

CS/JS: false
Ruby:  true
另一方面:

42 == 42
42 == 42
给出了结果:

CS/JS: true
Ruby:  true

这背后的原因是什么?

在JavaScript中,数组是通过引用而不是通过值进行比较的
[42]
[42]
是不同的实体(尽管是彼此的克隆体),因此不相等


不幸的是,42是所有问题的答案这一事实与此无关。

在JavaScript中,数组是通过引用而不是通过值进行比较的
[42]
[42]
是不同的实体(尽管是彼此的克隆体),因此不相等


不幸的是,42是所有问题的答案这一事实与此无关。

对于Javascript来说,比较是根本不同的

每个
[42]
都是一个新的数组,数组不会在结构上进行比较,它们只是检查它们是否是同一个对象。所以

[42] == [42]; // false. Different objects
var x = [42];
var y = [42];
x == y;       // false. Same check as [42] == [42]
x == x;       // true.  Same object

文字42是一种基本类型,按值进行比较

对于Javascript的情况,比较是根本不同的

每个
[42]
都是一个新的数组,数组不会在结构上进行比较,它们只是检查它们是否是同一个对象。所以

[42] == [42]; // false. Different objects
var x = [42];
var y = [42];
x == y;       // false. Same check as [42] == [42]
x == x;       // true.  Same object
文字42是一种基本类型,按值进行比较

JavaScript中的

[42] == [42]
说“这两个数组是同一个对象吗?”(不,它们不是),这与问“这两个数组包含相同的元素吗?”

另一方面:

42 == 42
42 == 42
“这两个数字基元的值是否相等?”

(注意:这过于简化了JavaScript的操作,因为
=
运算符将尝试将两个操作数转换为相同的类型;与
==
运算符形成对比。)

在JavaScript中

[42] == [42]
说“这两个数组是同一个对象吗?”(不,它们不是),这与问“这两个数组包含相同的元素吗?”

另一方面:

42 == 42
42 == 42
“这两个数字基元的值是否相等?”


(注意:这过于简化了JavaScript的工作,因为
==
运算符将尝试将两个操作数转换为同一类型;与
==
运算符形成对比。)

其他回答者在解释JavaScript/CoffeeScript相等语义方面做得很好。(CoffeeScript的
==
编译为JavaScript更严格的
==
,但在这种情况下没有区别。)

Ruby的情况更复杂:Ruby中的所有东西都是一个对象,因此每个对象都有一个
=
方法,原则上它可以做任何事情。对于数组,它查看另一个数组,检查它是否具有相同的长度,然后检查每个
x
本身和另一个数组中的
y

如果您想模拟Ruby行为,那么编写一个函数来模拟非常简单:

deepEquals = (arr1, arr2) ->
  return false unless arr1.length is arr2.length
  for i in [0...arr1.length]
    if arr1[i] instanceof Array and arr2[i] instanceof Array
      return false unless deepEquals(arr1[i], arr2[i])
    else
      return false if arr1[i] isnt arr2[i] 
  true

其他回答者在解释JavaScript/CoffeeScript平等语义方面做得很好。(CoffeeScript的
==
编译为JavaScript更严格的
==
,但在这种情况下没有区别。)

Ruby的情况更复杂:Ruby中的所有东西都是一个对象,因此每个对象都有一个
=
方法,原则上它可以做任何事情。对于数组,它查看另一个数组,检查它是否具有相同的长度,然后检查每个
x
本身和另一个数组中的
y

如果您想模拟Ruby行为,那么编写一个函数来模拟非常简单:

deepEquals = (arr1, arr2) ->
  return false unless arr1.length is arr2.length
  for i in [0...arr1.length]
    if arr1[i] instanceof Array and arr2[i] instanceof Array
      return false unless deepEquals(arr1[i], arr2[i])
    else
      return false if arr1[i] isnt arr2[i] 
  true