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

时间:2011-09-27 13:42:39

标签: javascript ruby coffeescript

示例:

[42] == [42]

比较结果给出了不同的结果:

CS/JS: false
Ruby:  true

另一方面:

42 == 42

给出了结果:

CS/JS: true
Ruby:  true

这背后的原因是什么?

4 个答案:

答案 0 :(得分:3)

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

Ruby案例更复杂:Ruby中的所有内容都是一个对象,因此每个对象都有一个==方法,原则上它可以做任何事情。对于数组,它会查看另一个数组,检查它是否具有相同的长度,然后检查其中x == y本身的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

答案 1 :(得分:2)

对于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是基本类型并按值进行比较。

答案 2 :(得分:1)

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

遗憾的是,42是所有事物的答案,这与此无关。

答案 3 :(得分:1)

在JavaScript中

[42] == [42]

说“这两个数组是同一个对象吗?” (不,他们不是),这与询问“这两个数组是否包含相同的元素?”不一样。

另一方面:

42 == 42

“这两个数字原语是否相等,按值进行比较?”

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