前言
事情的起因是这样的,笔者在玩浏览器控制台的时候,偶然发现下面这段代码的运行结果很有意思:
|
|
笔者一直以为 JavaScript 中所有的隐式类型转换规则都是一样的,所以特别纳闷,a
在隐式类型转换后明明变成了 false
,但在 if 语句中为什么又变成了 true
呢?查阅红宝书之后笔者才发现,JavaScript 的隐式类型转换并没有那么简单。
==
与 if 语句的隐式类型转换规则
当 ==
两边操作数的数据类型不同时,它遵循的隐式类型转换规则是这样的:
- 若有一个操作数是布尔值,则在比较前先将其转换为数值(false 转换为 0,true 转换为 1);
- 若有一个操作数为字符串,另一个操作数是数值,则在比较前先将字符串转换为数值。
所以也就不难理解,当比较 a == true
时,true
先被转换为了数值 1
,后又由于 a
是字符串,它被转换为了数值 0
,于是 a == true
的比较结果便是 false
。
而 if
语句的转换规则,是调用 Boolean()
转换函数将 if
表达式的结果转换为一个布尔值。当 Boolean()
转换函数遇到字符串时,只有空字符串会被转换为 false
,任何非空字符串都被转换为 true
,于是变量 a
便被转换为了 true
。
结语
JavaScript 是一门弱类型的编程语言,它的隐式类型转换机制带来了很多便利性,同时也埋下了许多坑,开发者一不小心就会掉进深坑里。所以在使用它的隐式类型转换机制时,一定要明白它的转换原理,同时应尽量避免使用像 ==
这样容易被带进坑里的类型转换特性。