js——类型转换

  总述                  

  • 类型转换:显式、隐式(自动)
  • 隐式转换是由编译器自动进行的,基本主要抽象操作有ToPrimitive, ToNumber, ToString, ToBoolean等
  • 显式转换是通过调用Number(), String(), Boolean()等来实现,后面的操作实际是和隐式一样的原理

  隐式转换           

  • ToPrimitive(input[, PreferredType]):根据可选的类型值,把input转换成非对象(基本类型); ToNumber和ToString转换对象时会调用该操作
input类型 返回结果

Undefined/Null/Boolean

/Number/String

输入为基本类型,结果与输入的一样
Object

根据内部方法[[DefaultValue]](hint)返回结果,不同的PreferredType(hint)有不同的操作

  • hint为String

1. 如果toString()返回基本类型,将其作为结果

2. 否则,如果valueOf()返回基本类型,将其作为结果

3. 否则,抛出TypeError异常

  • hint为Number

1. 先判断valueOf再判断toString(与上面String的相反),否则抛出TypeError异常

  • hint没有指定

Date类型的会把hint默认设置为String,其它会以Number处理

  • ToNumber
输入值类型 返回结果
Undefined NaN
Null +0
Boolean 1: true, 0: false
Number 与输入一致
String

个人总结:看起来像数字的字符串可以转换成相应的数字,否则返回NaN,具体例子如下

Object 返回ToPrimitive(input, Number)结果

String转换成Number 

 1 //空格
 2 Number("");//0
 3 Number("  01");//1
 4 //正负数
 5 Number("+9");//+9
 6 Number("-9");//-9
 7 //指数e
 8 Number("-9e-1");//-0.9
 9 Number("-9E-1");//-0.9
10 //无穷数
11 Number("-Infinity");//-Infinity
12 //不同进制
13 Number("0B10");//2
14 Number("0O10");//8
15 Number("0X10");//16
16 //数字
17 Number("100000000000000000000000000000");//1e+29
18 Number("0000.100");//0.1
19 //转换成了NaN
20 Number("-   0");//NaN
21 Number("ln10");//NaN
  • ToString
输入的类型 返回值
Undefined/Null/Boolean/String

"undefined"/"null"/"true"/"false"/与输入一致

基本类型,输入和返回一样

Number  对某些输入稍处理,然后作为字符串输出
Object 使用ToPrimitive(input, String)结果

Number转换成String

 1 String(NaN);//-"NaN"
 2 String(-Infinity);//"-Infinity"
 3 //正负数
 4 String(-0);//"0"
 5 String(+0);//"0"
 6 String(-9);//"-9"
 7 String(+9);//"9"
 8 //指数,会自动转换,有效位数尽量少
 9 String(0.000000009);//"9e-9"
10 String(1000000000000000000000000000000000);//"1e+33"
11 String(0.9e1);//"9"
12 String(0.9e-10);//"9e-11"
13 //会自动省去多余的0
14 String(0.90000000000000000);//"0.9"
15 //进制
16 String(0B10);//"2"
17 String(0O10);//"8"
18 String(0X10);//"16"
  • ToBoolean
结果 输入值
false (基本类型)0, -0, +0, NaN, "", false, Null, Undefined
true 基本类型中除上述的值,Object(所有Object都是!)
  •  ToObject
输入的类型 返回结果
Undefined/Null TypeError异常,Object(null/undefined)结果均为{}
Boolean/Number/String 对于基本类型会先创建一个对象,并把输入值作为对象的primitiveValue
Object 与输入相同

  产生隐式转换的操作  

转换为数字类型:数字运算符都会尝试把变量转换为数字,如~, <<, >>, +, -, *, /, ^, %, &, |, ++等

+:如果操作数不是数字,则通过ToPrimitive(input, number)进行转换。若结果中有操作数为字符串,则执行字符串拼接,否则执行数字加法

转换为布尔类型

if(..), while(...), for(;...;...), ?:, ||, &&(选择器运算符), !, !!     

==宽松相等比较,根据操作数的不同进行不同的类型转换

操作数类型 转换方式:对象->非对象,非数字->数字
string+number string转换为number
boolean+其它

boolean先转换为number,再做比较

"42"==true;//false

"42"==false;//false

null+undefined null == undefined;//true
对象+非对象 对象利用ToPrimitive拆封获得非对结果,再比较

  显式类型转换          

显式调用 隐式
Number(input) ToNumer(input)
String(input) ToString(input)
Boolean(input) ToBoolean(input)
Object(input) ToObject(input)

参考

ECMAScript规范5.1

《你不知道的javascript》中卷

原文地址:https://www.cnblogs.com/coolqiyu/p/7155994.html