跳到主要内容

构造函数

2023年02月10日
柏拉文
越努力,越幸运

Number()


Number()将参数强制转换为 Number 类型,如果该值不能被转换,它会返回 NaN

注意

+valueNumber(value) 作用相同,因为 +valueNumber() 使用的算法规则相同

语法

const result = Number(value)

const result = +value

返回值

返回Number类型的数值(转换失败,返回 NaN)

规则

  • 对于 Number 类型: 则总是返回自己

    const num = 10;
    console.log(Number(num), typeof Number(num)) // 10 number
    console.log(+num,typeof +num) // 10 number
  • 对于 undefined 类型: 返回 NaN

    const num = undefined;
    console.log(Number(num), typeof Number(num)) //NaN number
    console.log(+num,typeof +num) // NaN number
  • 对于 null 类型: 返回 0

    const num = null;
    console.log(Number(num), typeof Number(num)) // 0 number
    console.log(+num,typeof +num) // 0 number
  • 对于 Boolean 类型: true 返回 1; false 变成了 0

    const num = true;
    console.log(Number(num), typeof Number(num)) // 1 number
    console.log(+num,typeof +num) // 1 number
  • 对于 String 类型: 通过解析它们来转换, 解析规则如下:

    • 规则一、忽略前导和尾随空格/行终止符

      const num = " 3 ";
      console.log(Number(num), typeof Number(num)) // 3 number
      console.log(+num,typeof +num) // 3 number
    • 规则二、前导数值 0 不会导致该数值成为八进制文本

      console.log(Number("09")); // 9
    • 规则三、前导数值 0x 会导致该数值成为十六进制文本

      console.log(Number("0x19f")); // 415
    • 规则四、+- 允许在字符串的开头指示其符号, 且该字符串只能出现一次,不得后跟空格

    • 规则五、空字符串或仅空格字符串转换为 0

    • 规则六、Infinity-Infinity 被当作是字面量

      Number("Infinity") // Infinity

      Number("-Infinity") // -Infinity
    • 规则七、不允许使用数字分隔符

    • 规则八、除以上以外的字符串,只要某一个字符无法转换为数字,那么就会返回 NaN

  • 对于BigInt类型: 抛出 TypeError,以防止意外的强制隐式转换损失精度。

    const value = 10n;

    console.log(+value); // Cannot convert a BigInt value to a number
    console.log(Number(value)); // Cannot convert a BigInt value to a number
  • 对于Symbol类型: 抛出 TypeError

    const value = Symbol.for("aa");

    console.log(+value); // Cannot convert a Symbol value to a number
    console.log(Number(value)); // Cannot convert a Symbol value to a number
  • 对于 Object 类型: 对象首先按顺序调用 @@toPrimitive]()(将 number 作为 hint)、valueOf()toString() 方法将其转换为原始值。然后将生成的原始值转换为数值。

    const num = {};
    console.log(+num,typeof +num) // NaN number
    console.log(Number(num),typeof Number(num)) // NaN number

    过程分析:
    1. Number({})+{} 首先调用 valueOf(): {}.valueOf() 结果为 对象类型 {} , 因此不是原始值类型,所以执行以下步骤
    2. Number({})+{} 再调用 toString(): {}.toString() 结果为 字符串"[object Object]", 因此是原始值类型
    3. 所以 Number({})+{} = Number("[object Object]")+"[object Object]" , "[object Object]" 为无效字符串, 所以最后结果为 NaN
  • 对于 Array 类型: 数组首先按顺序调用 @@toPrimitive]()(将 number 作为 hint)、valueOf()toString() 方法将其转换为原始值。然后将生成的原始值转换为数值。

    const num = [];
    console.log(+num,typeof +num) // 0 number
    console.log(Number(num),typeof Number(num)) // 0 number

    过程分析:
    1. Number([])+[] 首先调用 valueOf(): [].valueOf() 结果为 对象类型 [] , 因此不是原始值类型,所以执行以下步骤
    2. Number([])+[] 再调用 toString(): [].toString() 结果为 字符串"", 因此是原始值类型
    3. 所以 Number([])+[] = Number("")+"" , "" 为空字符串, 所以最后结果为 0

    const num = [1,2];
    console.log(+num,typeof +num) // NaN number
    console.log(Number(num),typeof Number(num)) // NaN number

    过程分析:
    1. Number([1,2])+[1,2] 首先调用 valueOf(): [1,2].valueOf() 结果为 对象类型 [1,2] , 因此不是原始值类型,所以执行以下步骤
    2. Number([1,2])+[1,2] 再调用 toString(): [1,2].toString() 结果为 字符串"1,2", 因此是原始值类型
    3. 所以 Number([])+[] = Number("1,2")+"1,2" , "1,2" 为无效字符串, 所以最后结果为 NaN
  • 对于 Function 类型: 函数首先按顺序调用 @@toPrimitive]()(将 number 作为 hint)、valueOf()toString() 方法将其转换为原始值。然后将生成的原始值转换为数值。

    const num = function() {}; // NaN number
    console.log(+num,typeof +num) // NaN number
    console.log(Number(num),typeof Number(num))

    过程分析:
    1. Number(function() {})+function() {} 首先调用 valueOf(): function() {}.valueOf() 结果为 函数类型 [Function (anonymous)] , 因此不是原始值类型,所以执行以下步骤
    2. Number(function() {})+function() {} 再调用 toString(): function() {}.toString() 结果为 字符串"function () {}", 因此是原始值类型
    3. 所以 Number(function() {})+function() {} = Number("function () {}")+"function () {}" , "function () {}" 为无效字符串, 所以最后结果为 NaN

对比

  • 对比一、Number()new Number() 的区别

    • Number(value)

      • 特点一: 从返回值来看, Number(value) 返回 Number 类型的数字

      • 特点二:

        • Number(45) == 45

        • Number(45) === 45

    • new Number(value)

      • 特点一: 从返回值来看, new Number(value) 返回 Number 类型的包装对象

      • 特点二:

        • Number(45) == 45

        • new Number(45) !== 45

  • 对比二、Number()parseInt()parseFloat() 的区别

    • Number(value)

      • 特点一、只要参数带有无效字符就会被转换为 NaN
    • parseInt(value)

      • 特点一、parseInt() 无法识别小数点
    • parseFloat(value)

      • 特点一、parseFloat() 无法识别 0x 前缀

new Number()


new Number(value) 创建一个 Number 类型的包装对象

语法

const num = new Number("32")
console.log(num);

返回值

返回一个 Number 类型的包装对象, 如下所示:

Number {32}
[[Prototype]]: Number
[[PrimitiveValue]]: 32

对比

  • 对比一、Number()new Number() 的区别

    • Number(value)

      • 特点一: 从返回值来看, Number(value) 返回 Number 类型的数字

      • 特点二:

        • Number(45) == 45

        • Number(45) === 45

    • new Number(value)

      • 特点一: 从返回值来看, new Number(value) 返回 Number 类型的包装对象

      • 特点二:

        • Number(45) == 45

        • new Number(45) !== 45