== 的判断规则
等号两边都为基本数据类型
1、数值与数值的比较
0 == -0 // true
2、字符串与数值的比较
字符串 => 数值
'1' == 1 // true
'1a'== 1 => NaN == 1 // false
'' == 0 => 0 = 0 // true
3、字符串与布尔值比较
两边转换为数字
'a' == true => NaN == 1 // false
'' == false => 0 == 0 // true
4、布尔值与数值的比较
布尔值转数字
true => 1 false => 0
true == 1 // true
false == 0 // true
true == 100 => 1 == 100 //false
5、undefined和null
undefined和null互相比较或和自身比较都返回true,其他情况返回false
null == null // true
undefined == undefined // true
undefined == null // true
6、NaN
NaN和{}和任何值比较都返回false
NaN == NaN // false
NaN == 1 // false
7、Infinity
Infinity只和自身比较返回true
Infinity == Infinity // true
Infinity == 0 // false
存在引用数据类型
1、等号两侧都为引用类型时
地址值不同的,返回的都是 false
var a = { temp:1 }
console.log({ temp:1 } == a); // false
var b = [ 1, 2 ]
console.log([ 1, 2 ] == b); // false
2、有一侧不为引用类型
[] 可能会被转换为 0、‘’
[]中存在一个元素时会被转换为非引用类型
[] == 0 => 0 == 0 // true
[] == '0' => '' == '0' // false
[] == '' => '' == '' // true
[] == false // true
[1] == 1 => 1 == 1 // true
[1] == '1' => '1' == '1' // true
[1] == true // true
[0] == false // true
[1, 2] == 1 => NaN == 1 // false
[1, 2] == true => NaN == 1 // false
{x:1} == 1 => NaN == 1 // false
{x:1} == '1' => NaN == 1 // false
{x:1} == true => 1 == NaN // false
3、特殊的 {}
{} 和任何值比较都是false
var a = {}
var b = {}
console.log(a == b); // false
isNaN的判断
存在转换问题
isNaN(NaN) // true
isNaN(123) // false 123 != NaN
如果里面不是一个number类型的话,会用Number将其转化一下
isNaN('123') => isNaN(Number('123')) => isNaN(123) // false
isNaN('a123') => isNaN(Number('a123')) => isNaN(NaN) // true
isNaN('hello') => isNaN(Number('hello')) => isNaN(NaN) // true
isNaN(['xyz']) => isNaN(Number(['xyz'])) => isNaN(NaN) // true
isNaN({}) // true
特别的,在空数组,或者数组中只有一个元素,且元素为数字或数字字符串,会返回false
isNaN([]) // false
isNaN([123]) // false
isNaN(['123']) // false
isNaN(['a123']) // true
isNaN([123,456]) // true
Object.is()
和 == 差不多,但 Object.is
不会强制转换两边的值
Object.is('',false) // false
Object.is(0,false) // false
但 Object.is()
与 ===
也不相同。对待有符号的零和 NaN 不同
0 === -0 // true
Object.is(0, -0) // false
ps:总结自各大佬分享的文章,有修改,侵权删