【问题标题】:Comparison gives different results in Coffeescript/Javascript and Ruby比较在 Coffeescript/Javascript 和 Ruby 中给出了不同的结果
【发布时间】:2011-11-26 01:50:44
【问题描述】:

例子:

[42] == [42]

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

CS/JS: false
Ruby:  true

另一方面:

42 == 42

给出结果:

CS/JS: true
Ruby:  true

这背后的原因是什么?

【问题讨论】:

    标签: javascript ruby coffeescript


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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 是一个原始类型,按值进行比较。

      【讨论】:

        【解决方案3】:

        在 JavaScript 中

        [42] == [42]
        

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

        另一方面:

        42 == 42
        

        “这两个数字基元按值比较是否相等?”

        (注意:这是对 JavaScript 所做工作的过度简化,因为 == 运算符会尝试将两个操作数转换为相同的类型;与 === 运算符相反。)

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-08-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多