构造函数
Number()
Number()
将参数强制转换为 Number
类型,如果该值不能被转换,它会返回 NaN
。
+value
与 Number(value)
作用相同,因为 +value
与 Number()
使用的算法规则相同
语法
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
-
-
-