javascript的类型默认转换机制.
javascript是一门弱类型语言 它的函数形参不指定类型 它的变量在赋值时连同类型一起覆盖 所以不存在类型转换问题,等等,不存在类型转换问题?哦 只是赋值时不存在类型转换问题。 javascript的类型转换主要存在于表达式运算过程中,更直接的说,js的类型默认转换几乎全是由运算符引起的,这篇文章里还会讨论显式转换。
在js的运算符中 有以下几类
- +运算符 只作用于字符串和数字
- - * / %只作用于数字
- ! 只作用于布尔型
如果我们对2个变量a 和b使用+运算符 a+b
那么 js解释器也许会面对这样一个问题: a和b也许不都是数字并且不都是字符串
此时 他将如何做呢?
最基本的答案是 调用a 和b的 valueOf函数 把原来的表达式变成
a.valueOf()+b.valueOf()
但是 这并不完全 因为实际情况要复杂的多:
1.如果a.valueOf()和b.valueOf()仍然不适合+运算符呢?继续调用它们的valueOf 直到返回类型出现循环为止。在valueOf无法达到要求的时候 它会调用toString
2.如果a或b没有valueOf这个方法呢?一般情况下不会,因为Object.prototype提供了这个方法 它是原型链的顶级,所有对象都会共享它的方法。不过 如果你很bt地delete Object.prototype.valueOf 那么很可能导致你的对象整条原型链上都没有valueOf 这个时候 它会调用toString
3.如果a和b一个是字符串 另一个是数字 应该优先转换哪个呢? 当然是字符串啦:P
4.如果a和b的toString也被删掉了呢? delete Object.prototype.toString; 晕 太bt了吧 这样就只能当运算符和b不存在了
+运算符在所有运算符中的行为算是比较复杂的 其他运算符因为几乎只对一种类型起作用 所以并不像+这么复杂:
只对数字运算符起作用的运算符 在valueOf失败时 会把对象转换成NaN
只对布尔型起作的运算符 不会调用valueOf 会把对象按以下规则转换:
空字符串""
数字0
空对象null
非法数无穷大NaN
未定义类型undefined
转换成false 其他转换成true
BTW ,|| &&不是只对布尔值起作用