== 和 === 的区别

一、等于操作符

等于操作符用两个等号(==)表示,如果操作符相等,则会返回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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值