①使用parseInt()/parseFloat()(在ECMAScript6中是Number.parseInt()/Number.parseFloat())
1 console.log(parseInt('a10'));//NaN 2 console.log(parseInt('1a0'));//1 3 console.log(parseInt('10a'));//10 4 console.log(parseInt('10'));//10 5 6 console.log(parseFloat('a10.1'));//NaN 7 console.log(parseFloat('1a0.1'));//1 8 console.log(parseFloat('10a.1'));//10 9 console.log(parseFloat('10.1a'));//10.1 10 console.log(parseFloat('10.1'));//10.1
使用parseInt()/parseFloat将非数值类型转换为数值类型的时候:
a、如果是字符串类型,那么会对字符串中的字符逐个进行解析,直至解析到不能解析为数字的字符为止,然后将前面解析的部分转换为数值返回
b、如果是字符串类型以外的非数值类型,那么会首先调用该类型的toString()方法,然后再按字符串的方式进行转换
下面这个例子中,Person1使用默认的toString方法,Person2重写了toString方法。然后对两个类型的实例进行数值转换,结果如下:
1 function Person1(name,age){ 2 this.name=name; 3 this.age=age; 4 } 5 6 function Person2(name,age){ 7 this.name=name; 8 this.age=age; 9 //重写toString方法 10 this.toString=function(){ 11 return this.age; 12 } 13 } 14 15 var p1=new Person1('张三',24); 16 var p2=new Person2('张三',24); 17 18 console.log(p1.toString());//[object Object] 19 console.log(parseInt(p1));//NaN 20 21 console.log(p2.toString());//24 22 console.log(parseInt(p2));//24
当然parseInt()和parseFloat()也是有区别的,从字面意思就可以看出,parseInt()是将值转换为整型,parseFloat()是将值转换为浮点型,除此之外,两者的转换机制都是一样的。
1 console.log(parseInt('1.5'))//1 2 console.log(parseFloat('1.5'))//1.5
②使用‘+’运算符(等同于Number())
1 console.log(+'a10');//NaN 2 console.log(+'1a0');//NaN 3 console.log(+'10a');//NaN 4 console.log(+'10');//10 5 6 console.log(+'a10.1');//NaN 7 console.log(+'1a0.1');//NaN 8 console.log(+'10a.1');//NaN 9 console.log(+'10.1a');//NaN 10 console.log(+'10.1');//10.1
使用‘+’运算符与使用Number的效果是一样的。实际上,当‘+’运算符后面的部分是非数字时,该操作符会像Number()转型函数一样对后面的值进行转换。下面是使用Number()的结果。
1 console.log(Number('a10'));//NaN 2 console.log(Number('1a0'));//NaN 3 console.log(Number('10a'));//NaN 4 console.log(Number('10'));//10 5 6 console.log(Number('a10.1'));//NaN 7 console.log(Number('1a0.1'));//NaN 8 console.log(Number('10a.1'));//NaN 9 console.log(Number('10.1a'));//NaN 10 console.log(Number('10.1'));//10.1
当使用‘+’运算符或者Number()函数将非数值类型转换为数值类型的时候:
a、如果非数值类型为Boolean类型时,如果值为true,那么返回1;如果值为false,那么返回0
b、如果非数值类型为String类型时,需要分以下几种情况:
b1、如果字符串为空,那么直接返回0
b2、如果字符串全是数字(包括小数),那么直接转换为数值(如果字符串开头为0,则忽略开头的0)
b3、如果字符串是有效的十六进制格式(即以‘0X’或者‘0x’开头,后面是0~F),那么将其转换为相同大小的十进制数值
b4、如果字符串包含有上述格式以外的字符,那么直接返回NaN
c、如果非数值类型为null时,那么直接返回0
d、如果非数值类型为undefined时,那么直接返回NaN
e、如果非数值类型为Symbol类型时,则直接抛出异常(TypeError: Cannot convert a Symbol value to a string)
f、如果非数值类型为Object类型时,那么首先会调用对象的valueOf()方法,然后依照前面的规则对其进行转换