一、等于操作符
等于操作符用两个等号(==)表示,如果操作符相等,则会返回true
js中存在隐式类型转换,等于操作符在比较中会先进行类型转换,再确定操作数是否相等
遵循一下规则:
如果任一操作数是布尔值,则将其转换为数值再比较是否相等
let result1 = (true == 1)
console.log(result) // true
let result2 = (true == 3) // true转化为数值是1,与3不相等
console.log(result) // false
如果一个操作数是字符串,另一个操作数是数值,则尝试将字符串转换为数值,再比较是否相等
let result = ('10' == 10)
consoloe.log(result) // true
如果一个操作数是对象,另一个操作数不是, 则调用对象的valueOf()方法取得其原始值,再根据前面的规则进行比较
let obj= {
valueOf: function() {
return 1
}
}
let result = (obj == 1)
consoloe.log(result) // true
null和undefined相等
let result = (null == undefined)
console.log(result) // true
如果有任一操作符,则相等操作符返回false
let result = (NaN == NaN)
console.log(result ) // false
如果两个操作符都是对象,则比较他们是不是同一个对象,若指向同一个对象,返回true,否则返回false
let obj1 = {name: '张三'}
let obj2 = {name: '李四'}
let obj3 = {name: '张三'}
console.log(obj1 == obj2); // false
console.log(obj1 == obj3); // false (注:即便对象的属性和属性值都相同,但不是指向同一个对象的地址,所以返回false)
小结
- 两个都为简单类型,字符串和布尔值都会转化为数值再比较
- 简单类型与引用类型比较,对象转化为其原始类型的值再比较
- 两个都为引用类型,则比较他们是否指向同一个对象
- null和undefined相等
- 存在NaN则返回false
二、全等操作符
全等操作符由3个等于号(===)表示,只有两个操作数在不转换的前提下相等才返回true,即类型相同,值也需要相同
let result1 = ('10' == 10)
let result2 = (10 == 10)
consoloe.log(result1) // false
consoloe.log(result2) // true
undefined和null与自身严格相等
let result1 = (null === null)
let result2 = (undefined === undefined)
console.log(result1) // true
console.log(result2) // true
三、区别
相等操作符(==)会做类型转换,在进行值的比较,全等运算符不会做类型转换
let result1 = ('10' == 10)
let result2 = (10 == 10)
consoloe.log(result1) // false
consoloe.log(result2) // true
let result1 = (null == undefined) // true
let result2 = (null === undefined) // false
小结
相等运算符隐藏的类型转换,会带来一些违反直觉的效果
‘’ == ‘0’ // false
0 == '' // true
0 == '0'
false == 'false' // false
false == '0' // true
在比较null的情况的时候,我们一般使用相等操作符 ==
const obj = {}
if(obj.x == null) {
console.log('1') // 执行
}
// 等同于下面的写法
if(obj.x === null || obj.x === undefined) {
...
}
使用 == 的写法明显更加简洁了
所以,除了在比较对象属性null或者undefined的情况下,我们可以使用相等操作符(==),其他情况建议使用 ===
更多前端知识请访问我的前端花园
地址:https://www.yuque.com/linghualuan