为什么 === 比 == 安全?7个类型转换黑洞

开发 前端
类型转换是 JavaScript 里最容易让人踩坑的特性之一,尤其是双等号(==)的隐式类型转换,经常会产生一些令人意想不到的结果。

类型转换是 JavaScript 里最容易让人踩坑的特性之一。尤其是双等号(==)的隐式类型转换,经常会产生一些令人意想不到的结果。让我们一起深入了解这些陷阱,避免在实际开发中犯错。

陷阱一:数字与字符串比较

这可能是最常见的类型转换场景,但也藏着不少坑:

console.log(1 == '1')     // true
console.log(1 == '1.0')   // true
console.log(1 == '01')    // true
console.log(0 == '')      // true

// 更离谱的例子
console.log(999 == '999fitness') // false
console.log(0 == '0.0000')      // true

这里的转换规则是:当数字和字符串比较时,会尝试将字符串转换为数字。但如果字符串不是一个有效的数字表示,结果就会出人意料。

陷阱二:布尔值的转换

布尔值在比较时会先被转换为数字(true 转为 1,false 转为 0):

console.log(true == 1)     // true
console.log(false == 0)    // true
console.log(true == '1')   // true
console.log(false == '')   // true

// 令人困惑的例子
console.log(false == '0')  // true
console.log(true == '2')   // false
console.log(true == ['1']) // true  🤯

陷阱三:null 和 undefined

null 和 undefined 的比较规则特殊:

这是因为 null == undefined 是特殊规定的,而在涉及大小比较时,null 会被转换为数字 0。

陷阱四:对象与原始类型比较

当对象与原始类型比较时,会调用对象的 valueOf() 或 toString() 方法:

陷阱五:数组的特殊情况

空数组和数组的转换规则尤其令人困惑:

陷阱六:多重类型转换

当涉及多个操作数时,转换规则会变得更加复杂:

陷阱七:NaN 的比较

NaN 是 JavaScript 中最特殊的值之一:

console.log(NaN == NaN)        // false
console.log(NaN === NaN)       // false
console.log(typeof NaN)        // "number"

// 正确的检查方式
console.log(isNaN(NaN))        // true
console.log(Number.isNaN(NaN)) // true
责任编辑:赵宁宁 来源: JavaScript
相关推荐

2019-04-24 08:00:00

HTTPSHTTP前端

2013-09-27 10:03:31

AndroidiOS 7

2021-05-12 08:15:53

HTTPSHTTP安全

2018-06-21 08:50:53

2021-01-13 10:51:08

PromissetTimeout(函数

2022-11-10 15:32:29

2021-03-11 14:46:05

C++类型转换语言

2020-12-30 07:55:37

C++转换类型

2015-07-31 16:29:15

DockerJavaLinux

2021-12-27 07:10:26

ClassmethodStaticmetho函数

2016-12-14 12:02:01

StormHadoop大数据

2017-02-14 14:20:02

StormHadoop

2024-10-24 14:16:19

2021-05-13 07:58:05

HTTPSHTTP安全

2020-02-24 12:34:21

JuliaPython编程语言

2024-08-19 00:10:05

RocketMQ应用SDK

2018-10-07 05:08:11

2017-03-23 14:37:19

WebAssemblyasm.js编程

2020-03-18 14:08:48

Windows操作系统功能

2022-12-22 21:01:11

点赞
收藏

51CTO技术栈公众号