前端常见问题梳理 - 1,Number(1),new Number(1) 的区别和我的总结发挥

写这篇文章,主要是查了半天,各种比较但都是 1 和 new Number(1),有时候文字写的是Number(1)但最后用的还是 new Number(1)。索性三个一起拿出来分析一下。

1,Number(1),new Number(1) 都有自己的归属

想明白这个问题,我觉得先要明确一个事情,Number 是一个function

    Number instanceof Function // true

既然Number是个function,那么就好理解了。

  • 1:原始资料类型,还包括 字符串,布尔值,null 和undifine。

  • Number:一个function,返回原始资料类型

  • new Number():包装对象的返回结果。

    对象 Number,String,Boolean可以将原始资料类型的值变为包装对象。

    我是这么理解的:Number是个构造函数,new Number 返回继承自该构造函数的类,这个类我们叫包装对象。

    当然,既然用了新名词,肯定有点特殊的地方,稍后捋一下。

深入理解一下 1

var a = 1
console.log(a)  // 1
console.log(typeof a)  // number
console.log(a.__proto__)    // Number {0, constructor: ƒ, toExponential: ƒ, toFixed: ƒ, toPrecision: ƒ, …}
console.log(a.toFixed)      // toFixed() { [native code] }
  • 首先,1是存在__proto__的,并且指向了Number。所以,1 可以理解为 继承自 Number的一个对象(因为一般来说 只有对象才有__proto__属性)。
  • 只是这个对象被特殊化了,特殊到 本身不附带并且不能添加 任何属性和方法
  • 虽然本身没有方法,但它同样可以使用从 Number 继承过来但方法,如 toFixed等
  • 特殊化的 1,仍然不是严格意义上的对象,因为, 1===1 。
var a1 = 1
var a2 = 1
var b1 = new Object()
var b2 = new Object()
console.log(a1 === a2)  // true
console.log(b1 === b2)  // false

显然,1 不是对象。因为对象是引用类型的,new 创建出来两个对象,不可能相等。

所以,这里我姑且为原始资料类型 1 做个简单粗犷的归纳:是继承自Number方法的 自身不附带属性方法的 特殊对象

简单回顾一下Number

  • 这个Number 和 number 不是一个,我们说Number 是一个构造函数,这个函数定义的针对"数字"这种原始资料类型 的各种方法
  • number 则是一个类型,是 "数字" 的一个类型描述
  • Number 这个方法接受 类型是 number 的参数,并返回 对这个参数的原始资料类型
var a1 = 1
var a2 = Number(1)
console.log(a1 === a2)

这里,Number返回的 是原始资料类型 1

理解包装对象

我们把Number, String, Boolean 称为包装对象,因为他们可以把原始资料类型的值包装成对象

var num = new Number(1);
var str = new String('a');
var boo = new Boolean(true);
console.log(typeof num);    // "object"
console.log(typeof str);    // "object"
console.log(typeof boo);    // "object"

这个包装的过程,其实就是构造函数的实例化。实例化之后,他便有了 包装对象的属性和方法,这点很容易理解。

包装对象实现将 原始资料类型转成对象的过程,就是用的 new Number(1)

new Number(1) 的返回结果

  • 这个返回结果,跟原始资料对象不同,这个返回结果是实实在在的一个对象。它继承自Number,拥有它的所有属性和方法。
  • 通过valueOf方法,可以获取到对应的原始资料类型的值
var num = new Number(1);
console.log(num)    // Number {1}
console.log(num.toFixed)    //  toFixed() { [native code] }
console.log(num.valueOf())    // 1
console.log(num.valueOf() === 1)    // true

JS总是会求值出原始资料,而不是包装对象

var a = new Number(12);
var b = a + 3;

typeof b; // number

总结发言

两者的区别就是原始类型和包装对象的区别

  • 1:Number 是一个特殊的函数,又称为包装对象
  • 2:1 是原始资料类型的值,是继承自Number方法的 自身不附带属性方法的 特殊对象
  • 3:new Number(1) 是包装对象将 原始资料类型的值转成对象的过程,同样可以通过 valueOf获取该原始资料类型

随机浏览