【问题标题】:why 3==new Number(3) gives true why?为什么 3==new Number(3) 给出 true 为什么?
【发布时间】:2020-12-11 18:11:29
【问题描述】:

我点击以下链接

Why should you not use Number as a constructor? Question about object.method in JavaScript

why 3==new Number(3) 给出真实的为什么??

3== new Number(3) // true

据我所知,== 只检查值。但是 new Number(3) 是一个对象,它的值如何变成3

new Number(3) 的值如何是 3

【问题讨论】:

  • new Number(3).valueOf() 返回什么?

标签: javascript


【解决方案1】:

Abstract Equality Comparisonx == y,在第 10 步:

如果 Type(x) 是 String、Number、BigInt 或 Symbol 且 Type(y) 是 Object,则返回比较结果 x == ToPrimitive(y)。

所以评价

3 == new Number(3)

变成

3 == Number(new Number(3))

虽然new Number(3) 产生一个(数字)对象,但它随后被强制转换为其原始值(一个普通的非对象数字),而3 == 3true

【讨论】:

  • 另外,如果你想在不强制值的情况下进行比较,你应该使用===
【解决方案2】:

由于 javascript 中的coercion,所以它是真实的。

Javascript 将在计算相等运算时将对象隐式转换为数字。

【讨论】:

    【解决方案3】:

    虽然== 确实会强制数据类型以进行比较,但您的基本问题是:

    据我所知== 只检查值。但new Number(3) 是一个对象 它的值变成3

    有不同的答案。 JavaScript 中的所有对象都继承自Object.prototype,并且该对象具有valueOf()toString() 方法。当需要该值的基本(原始)值或字符串表示时,JavaScript 运行时会自动使用这些方法。因此,在这种情况下,虽然 new Number(3) 返回一个对象,但隐式调用 valueOf() 方法以返回 3 的值,以供表达式的其余部分使用。

    来自上面的 MDN 链接:

    JavaScript 调用 valueOf 方法将对象转换为 原始价值。您很少需要调用valueOf 方法 你自己; JavaScript 在遇到 需要原始值的对象。

    正如我所说,这些方法会在需要时自动调用,但您也可以在任何对象上调用它们:

    // There will be no implicit call for .valueOf here because there is no 
    // context for the JS runtime to know what you want to do with the object.
    // Instead, you get {}, which means Object
    console.log(new Number(3));  // {} 
    
    // But, you can get the most basic value if you want:
    console.log(new Number(3).valueOf());  // 3

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 2020-08-03
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      相关资源
      最近更新 更多