javascript:类型转换
JS是一门弱类型的语言,很多情况下,你不必要去显示的进行类型转换。
在需要的地方,JS解释器会自动进行类型转换。
类型的转换,依赖于一套具体的规则,先来考虑一下 原始类型之间的转换规则。
null类型
null是null类型的唯一值
Number 0
String "null"
Boolean false
undefined类型
Number NaN
String "undefined"
Boolean false
Number类型
String 无论是实数还是NaN,Infinity都只是简单的括上引号
Boolean 除了 0 , -0 ,NaN为false其余都为true
String类型
Number 如果字符全由数字字符构成,那么转为这个数字,否则为NaN
Boolean 只有空串“”被解释为false
Boolean类型
Number true转换为1 false转换为0
String “true” 和 "false"
对象到原始类型之间的转换
对象类型到Boolean类型的转换是最简单的,所有的对象都转换为boolean类型中的true,即使是false的包装对象。
对象到String和Number之间的转换就不那么直观了,转换的中间可能涉及到多个步骤,并且依赖于toString和valueOf这两个函数。
首先来看看对象到String类型到转换。
首先,JS解释器会调用这个对象上toString方法,如果这个方法返回任意类型的原始值,那么就把这个原始值
再转换为字符串,作为此次转换的结果返回。如果这个方法返回了一个对象,或者这个toString不是一个方法(原型链的覆盖)
那么JS解释器会故技重施,像操作toString那样去调用valueOf,如果valueOf没有返回原始值或者是根本就不是一个方法,
JS解释器报错,类型转换失败,下面是个简单的例子。
function x(){};
x.prototype.toString=function(){
return 100;
}
x.prototype.valueOf=function(){
return 'i am split';
}
var obj=new x;
console.log(String(obj));// 返回原始值100 转换为字符串 输出"100"
x.prototype.toString=function(){
return {};//toString返回一个对象 所以被跳过
}
console.log(String(obj));// 输出"i am split" 即valueOf返回值
x.prototype.toString=1;
x.prototype.valueOf=1;
console.log(String(obj));// 错误,因为对象既没有toString也没有valueOf 类型转换失败
对象到Number类型的转换就像到String的转换,只不过JS解释器先调用valueOf,期望valueOf返回一个原始值,并把这个原始值转换为Number类型
如果valueOf返回了一个对象,或者压根不是一个方法,那么用同样的逻辑调用toString。
function x(){};
x.prototype.toString=function(){
return 100;
}
x.prototype.valueOf=function(){
return 'i am split';
}
var obj=new x;
console.log(Number(obj));// valueOf返回原始值'i am split' 转换为Number 即为NaN
x.prototype.valueOf=function(){
return {};//返回一个对象 所以被跳过
}
console.log(Number(obj));// 输出100 即toString返回值
x.prototype.toString=1;
x.prototype.valueOf=1;
console.log(Number(obj));// 错误,因为对象既没有toString也没有valueOf方法