【问题标题】:Why is new Number(8) not exactly equal to 8?为什么 new Number(8) 不完全等于 8?
【发布时间】:2015-11-13 15:23:25
【问题描述】:

alert 返回 false 而不是 true?因为 x 和 y 的类型都是数字,并且根据 === 的文档,它是一个严格的比较,它检查类型和值。

var x=8;
var y=new Number(8);
alert(typeof x);
alert(y===x);//false

PS:JavaScript 新手仍然了解基本概念。

【问题讨论】:

标签: javascript


【解决方案1】:

基本类型BooleanNumberString,都有对应的对象表示,可以通过new Boolean、@创建987654322@ 等。正如我已经暗示的那样,它们返回 objectsObjectNumber 是不同的数据类型,因此严格比较将返回 false

但是,这些构造函数并没有被广泛使用,因为正如您所发现的,它们不能很好地与原语配合使用。封装与 primitive 数值相同的值的Number 对象不(严格)等于所述原始值。

您可能更经常看到的是在没有new 的情况下使用Number 函数。如果在没有new 的情况下调用,Number 只需执行类型转换,到原始数值。


那么为什么我们有NumberStringBoolean 对象呢?

事实证明,您一​​直在(可能)不知道的情况下使用此类对象,例如当你这样做时

"primitive".substring(0, 5)

在 JavaScript 中,只有 objects 可以有属性。原始值不能具有属性。然而,您可以调用 substring 方法,就好像它是值的属性一样。那是因为 JavaScript 做了一种叫做 auto-boxing 的东西。当您尝试使用像对象这样的原始值时(例如,通过访问属性),JavaScript 会在内部临时将原始值转换为其等效的对象版本。

【讨论】:

    【解决方案2】:

    这是因为当使用new 实例化时,类型是object,即使该对象的名称是数字。

    typeof y === "object"
    

    【讨论】:

      【解决方案3】:

      Y 是一个对象而不是一个数字。新关键字对对象的引用。所以 y 是一个数值为 8 的数字对象。

      试试alert(typeof y);

      【讨论】:

        【解决方案4】:

        首先,警报总是返回undefined。但它会在屏幕上打印东西。 console.log 为您提供更详细、更丰富的信息。

        这个问题有两个部分。第一个是数字通常不是Number 实例。第二个是任何类型的两个对象(两个实例)永远不会完全相等:

        {}=={}  // false
        

        不是Number问题

        现在到Number 问题。尽管 JavaScript 中的所有数字在技术上都是 Number,但 javascript 不会那样对待它们,它们不是数字实例。这是我不太喜欢的东西,但它就是这样。如果按实例创建数字,它的行为是非对象值:

        5 instanceof Number  //false
        typeof 5 // "number"
        

        使用Number 构造函数创建数字会创建一个充当Number 的对象:

        new Number(5) instanceof Number  //true
        typeof new Number(5) // "object"
        

        需要注意的是,这个对象其实并不是很特别。您可以制作自己的数字类:

        函数 MyNumber(val) { this.number = 1*val||0; } MyNumber.prototype.valueOf = function() { 返回 this.number; }

        这将与Number 对象一样工作。当然,就像Number 对象一样,当你进行数学运算时,它会丢失:

        typeof (MyNumber(6)+MyNumber(4)) // "数字"

        两个对象实例永远不会完全相等

        这实际上是一个有用的功能。但它在这里背叛了你:

        new Number(5)===new Number(5) //false
        

        Number 实例永远不会完全等于除自身之外的任何事物。

        【讨论】:

          【解决方案5】:

          当您创建 var y=new Number(8); 时,它会变成一个对象而不是数字,因此 === 无法将两者进行比较。

          var x=8;
          var y=new Number(8);
          alert(typeof x);//number
          alert(typeof y);//object
          alert(y===x);//false
          

          【讨论】:

            猜你喜欢
            • 2021-10-03
            • 1970-01-01
            • 2019-10-25
            • 2021-02-14
            • 1970-01-01
            • 2020-01-12
            • 2015-04-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多