数值转换之Number()

Number()适用于任何类型转换为数值类型(number)

5大基本数据类型:number,string,Boolean,undefined,null
1种复杂数据类型:object

参数为Boolean

true --- 1
false --- 0

参数为number

简单的传入和返回,实际不做任何操作

参数为undefined

返回NaN

参数为null

返回0,null表示空对象指针,是特殊的

参数为string

  1. 字符串只含正负号和数字,会直接转换为相应整数,忽略前导0。如果还含有其他字符,返回NaN。
Number("-0123");  //-123
Number("12adc");   //NaN
  1. 浮点数,与第1点类似
Number("3.12");   //3.12
Nmuber("3.12x");  //NaN
Nmuber("0003.12");  //3.12
Number("1.2e4");  //12000
  1. 可正常转换十六进制数,由于Number会忽略前导0,所以不能进行8进制数转换
Number("0x12");   //18
Number("080");    //80
  1. 空字符串则返回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

参考:JavaScript 教程/语法专题/数据类型的转换

上一篇:枚举类中枚举值不存在.valueOf(enum) 抛异常处理


下一篇:java包装类