Number()适用于任何类型转换为数值类型(number)
5大基本数据类型:number,string,Boolean,undefined,null
1种复杂数据类型:object
参数为Boolean
true --- 1
false --- 0
参数为number
简单的传入和返回,实际不做任何操作
参数为undefined
返回NaN
参数为null
返回0,null表示空对象指针,是特殊的
参数为string
- 字符串只含正负号和数字,会直接转换为相应整数,忽略前导0。如果还含有其他字符,返回NaN。
Number("-0123"); //-123
Number("12adc"); //NaN
- 浮点数,与第1点类似
Number("3.12"); //3.12
Nmuber("3.12x"); //NaN
Nmuber("0003.12"); //3.12
Number("1.2e4"); //12000
- 可正常转换十六进制数,由于Number会忽略前导0,所以不能进行8进制数转换
Number("0x12"); //18
Number("080"); //80
- 空字符串则返回0
Number(""); //0
Number()对参数为字符串的转换是很严格的,字符串内若含有与number类型无关的字符,结果都会是NaN
参数为对象
当参数为对象时,将返回NaN,除非包含单个数值的数组
Number([5]); //5
对于对象执行Number()函数,经历以下步骤:
对象先调用自身方法ValueOf(),如果返回原始类型的值,则执行Number函数,如果返回的还是对象(可以用typeof查看返回类型),则在ValueOf()基础上继续调用自身方法toString(),再执行Number函数,此时按照参数是字符串类型来处理。
var obj = {x: 1};
Number(obj) // NaN
// 等同于
if (typeof obj.valueOf() === 'object') {
Number(obj.toString());
} else {
Number(obj.valueOf());
}
默认情况下,对象的
valueOf
方法返回对象本身,所以一般总是会调用toString
方法,而toString
方法返回对象的类型字符串(比如[object Object]
)
var a = [1,2];
var b = [5];
a.valueOf(); // (2) [1, 2]
typeof a.valueOf(); //"object"
b.valueOf(); //[5]
typeof b.valueOf(); //"object"
//valueOf()的返回值是对象类型,继续调用toString()
a.valueOf().toString(); //"1,2"
b.valueOf().toString(); //"5"
//分别对调用toString()后的结果执行Number()
Number([1,2].valueOf().toString()); //NaN
Number([5].valueOf().toString()); //5
由于对象的valueOf和toString方法是可以自定义的,当方法是返回数值类型时,根据返回值的不同就可以确定两个方法的调用顺序:
Number({
valueOf: function () {
return 2;
}
})
// 2
Number({
toString: function () {
return 3;
}
})
// 3
Number({
valueOf: function () {
return 2;
},
toString: function () {
return 3;
}
})
// 2,valueOf先于toString