==equality等同 和 ===identity恒等
==两边值类型不一样时,先进行类型转换再比较,===两边类型不一致时,不进行类型转换,类型不同一定不等。
先说恒等===
1.如果类型不同,肯定【不相等】
2.如果两边都是数值型,并且是相同的值,那么【相等】(!例外:如果有一边是NaN 那就【不相等】,判断是不是NaN 用isNaN() 函数)
3.如果两边都是字符串,并且值一样也就是说每个位置的字符一样,那么【相等】
4.如果两边都是true或两边都是false,那么【相等】
5.如果两边引用的是同一个对象,函数,地址等,那么【相等】
6.如果两边都是Null 或者 两边都是undefined,那么【相等】
再说等同==
1.如果两个值的类型相同,使用===比较
2.如果两个值的类型不同,先转换类型再比较
a.如果一边是null 另一边是undefined 那么【相等】
b.如果一个字符串,一个数值,那么把字符串转换成数值再比较
c.如果一边是true,把他转换为1在进行比较,如果一边是false,把他转换为0再进行比较
d.如果一个是对象,另一个是数值或字符串,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的toString或者valueOf方法。 js核心内置类,会尝试valueOf先于toString;例外的是Date,Date利用的是toString转换。非js核心的对象,另说
e.任何其他组合都【不相等】
例如:"1" == true //类型不等,true会先转换成数值 1,现在变成 "1" == 1,再把"1"转换成 1,比较 1 == 1, 相等。
=赋值
==等于
===严格等于
上例子
var a = 3;
var b = "3"
a==b true //类型不同,先转换,字符串3隐式转换数值型,然后相等
a===b false //类型不同直接就是不同
//如果等号两边是boolean、string、number三者中任意两者进行比较时,优先转换为数字进行比较
1 == '01' true
1 === '01' false
'1' == '01' false
'1' === '01' false
null==null true
null===null true
undefined==null true
undefined===null false
undefined==undefined true
undefined===undefined true
NaN==NaN false
NaN===NaN false
特别注意
NaN==NaN false
NaN===NaN false
//NaN和所有值,包括它自己都不相等
//数组和字符串的比较,空数组被转换为空字符串,非空数组转换为字符串
[]=='' true
[]==='' false
['1','2','3']=="123" false
['1','2','3']==="123" false
['1','2','3']=="1,2,3" true
['1','2','3']==="1,2,3" false
[]==true false
[]===true false
//null和undefined
let n=null
undefined
n
null
let u
undefined
u
undefined
n==u
true
n===u
false
//null和undefined之间==可以为true
//null,undefined和其他类型比较就是false
null==[]
false
null=='1'
false
null==1
false
undefined==1
false
undefined=='1'
false
undefined==[]
false
!==和!= 也和上面一样区别
参考:JavaScript中三个等号和两个等号的区别(== 和 ===)浅析