Javascript属于弱类型语言,在取值类型非常灵活的同时,需要了解它的类型转换机制,避免在一些地方混淆不清。
一、原始值到原始值
1.布尔值
当js期望一个boolean值时,可以提供任何类型给它,js会自行转换类型。真值为true,假值为false。
所谓的假值,个人觉得常见的有null,undefined,”“(空串),Nan。 注意:任意对象(包括空对象{},空数组[ ],Infinity和-Infinity也都是真值,转换为true。
2.Nunber
true 为 1 false 为0。然后注意一下产生NaN的情况。
parseInt
parseFloat
二、原始值到对象
1.原始值通过调用String() Number() Boolean()构造函数,转换为各自的包装对象。(显示转换).
x + "" 等价于 String(x)
+x 等价于Number(x)
!!x 等价于Boolean(x)
2.null和undefined 例外,所有期望转换他们的地方,都会throw TypeError
三、对象到原始值的
1.对象到Boolean型的转换:所有的对象(include数组和函数)都转化为true。
比较容易出错的一个地方:new Boolean(false) 它会转换为true,因为它是一个包装类对象。
2.对象到字符串:——>toString()——>valueOf()
(1)对象具有toString()方法,则调用这个方法,如果返回一个原始值,转换为字符串(不是字符串)。(
多数情况下,对象是继承自Object类,均带有toString()方法,即使有时候自带的toString()没有多大意义。目前遇见的只有在Object.create()传入null作为参数的时候会出现没有toString()方法的情况。)
(2)对象没有toString()方法,则调用valueOf()方法,若存在。如果返回值是原始值,Javascript会转换为字符串。
(3) 否则,无法转换,throw TypeError
3.对象到字符串:——>valueOf()——>toString() 具体情况和转换为字符串类似。
空数组转换为0
四、其他相关
1.转换和相等性:在用 == 运算符判断相等时,中间对有默认的类型转换行为发生。 === 恒等运算符则不做任何类型转换。
2. + 可执行加法运算和字符串连接, 在有运算值为对象时,会执行对应的到字符串或者数字的转换。 - 号会尝试把两个操作数转换为数值。
3. var now = new Date() ,now到字符串的转换(直接调用toString(),隐式转换),调用valueOf()转换为数值,毫秒数。