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方法

 

posted @ 2017-06-19 14:22  split  阅读(691)  评论(0编辑  收藏  举报