JavaScript 中的隐式类型转换

前言

事情的起因是这样的,笔者在玩浏览器控制台的时候,偶然发现下面这段代码的运行结果很有意思:

1
2
3
4
5
6
7
8
9
10
let a = '0';
console.log(a == true); // false
console.log(a == false); // true
if (a) {
console.log('true');
} else {
console.log('false');
} // 'true'

笔者一直以为 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 是一门弱类型的编程语言,它的隐式类型转换机制带来了很多便利性,同时也埋下了许多坑,开发者一不小心就会掉进深坑里。所以在使用它的隐式类型转换机制时,一定要明白它的转换原理,同时应尽量避免使用像 == 这样容易被带进坑里的类型转换特性。

------ 本文结束 ------
坚持原创技术分享,您的支持将鼓励我继续创作!