JavaScript中的各种运算符对数据类型是有要求的,如果运算符发现,运算子的类型与预期不符,就会自动转换类型。例如:减法运算符预期左右两侧的运算子应该是数值,如果不是,就会自动将它们转为数值。
由于自动转换是以强制转换的为基础的,我们先来看强制转换。
1 强制转换
强制转换:主要是指使用Number()
、String()
和Boolean()
三个函数,手动将各种类型的值分别转换成数字、字符串或者布尔值。
-
使用
Number
函数:测试如下 -
使用
String
函数:可以将任意类型的值转化成字符串。转换规则如下- 针对原始类型值:
- 数值:转为相应的字符串
- 字符串:还是原来的值
- 布尔值:
true
变为"true"
,false
变为"false"
- undefined:转为字符串
"undefined"
- null:转为字符串
"null"
- 针对对象:除非重写valueOf方法和toString方法(具体参考JavaScript运算符-学习笔记一文加法运算符中的对象相加中做了详细测试),默认值则如下:
String({a:1})
:结果为"[object Object]"
String([1,2,3])
:结果为"1,2,3"
- 针对原始类型值:
-
使用
Boolean
函数:可以将任意类型的值转为布尔值。转换规则为:除了undefined
、null
、0
、NaN
、""
这5个值的转换结果为false
,其他的值全部为true
。Boolean({}) // true Boolean([]) // true Boolean(new Boolean(false)) // true
2 自动转换
以下三种情况时,JavaScript 会自动转换数据类型,即转换是自动完成的,用户不可见。
-
不同类型的数据互相运算;
123+'abc' //"123abc"
-
对非布尔类值类型的数据求布尔值;
if ('abc') { console.log('hello') } //控制台会输出“hello”
-
对非数值类型的值使用一元运算符(正号和符号)
+[1] //1 + {foo: 'bar'} // NaN - [1, 2, 3] // NaN
自动转换的规则:预期什么类型的值,就调用该类型的转换函数。
比如,某个位置预期为字符串,就调用String()
函数进行转换,如果该位置既可以是字符串,也可能是数值,那么默认转为数值。
自然地,若JavaScript预期某个位置为布尔值,则会自动调用Boolean()
函数进行转换;预期转为数值则会自动调用Number()
函数进行转换。