考点:强制类型转换
在JavaScript中,使用 === 和 == 运算符来进行相等性比较。
=== 运算符用于严格相等性比较,它比较值和类型是否都相等。只有在两个操作数的值和类型完全相等时才返回 true,否则返回 false。
== 运算符用于非严格相等性比较,它只比较值是否相等。在比较之前,它会自动进行类型转换,如果操作数的类型不同,会尝试将它们转换为相同类型,然后再进行比较。例如,1 == '1' 会返回 true,因为它们的值相等,即使一个是数字类型,一个是字符串类型。
使用 === 运算符可以避免类型转换带来的意外行为,因此在大多数情况下,建议使用 === 运算符进行相等性比较。只有在确实需要进行类型转换时,才使用 == 运算符。
以下是一些使用 === 和 == 的例子:
var a = 1;
var b = '1';
console.log(a === b); // false
console.log(a == b); // true,自动进行类型转换
console.log(0 === false); // false,类型不同
console.log(0 == false); // true,进行类型转换
console.log(null === undefined); // false,类型不同
console.log(null == undefined); // true,特殊规则
总而言之,使用 === 运算符进行严格相等性比较是一种较为安全和可靠的做法,只有在明确需要进行类型转换时,才使用 == 运算符。
练习
// 字符串拼接
let a = 100 + 10 // 110
let b = 100 + '10' // '10010'
let c = true + '10' // 'true10'
// ==
100 == '100' // true
0 == '' // true
0 == false // true
false == '' // true
null == undefined // true
// 除了==null 之外,其他一律用 ===
const obj = { x: 100 }
if(obj.a == null){} // 相当于 if(obj.a === null || obj.a === undefined)
// 前置知识:truly 变量 和 falsely 变量
// truly变量:!!a === true (经过两步非运算值为true)
// falsely变量: !!a === false (经过两步非运算值为false)
// 以下是falsely变量,除此之外都是truly变量
!!0 === false
!!NaN === false
!!'' === false
!!null === false
!!undefined === false
!!false === false
// if语句
if(a){} // falsely
if(!!0 === false) // truly
// 逻辑运算
console.log(10 && 0) // 0
console.log('' || 'abc') // abc
console.log( !window.abc ) // true
