【JavaScript】中 == 和 === 的区别

Posted by ARTROY on 2018-06-24

两个操作数之间的 " == " 与 " === "

1、 两个不同的基本数据类型: 如果两个基本数据类型(Number、String、Boolean、Null、Undefined)不同,会将它们进行数据类型转化,再进行比较。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
0 == ''                                                  // true
0 == '0' // true
1 == '1' // true
'0' == '' // false

false == 0 // true
false == '0' // true
false == 'false' // false
false == null // false
true == null // false
false == undefined // false
true == undefined // false
null == undefined // true
NaN == NaN // false

0 === '' // false
0 === '0' // false
1 === '1' // false

false === '0' // false
null === undefined // false

[] == false // true
![] == false // true
![] == [] // true
![] === [] // false

null === document.getElementById('ABC') // true(document.getElementById('ABC') 不存在)

2、 基本数据类型与引用数据类型: 将引用数据类型(function、object,其中object包含array)转化(后台自动调用 Object.prototype.valueOf() )为它的原始值,再进行比较。例如:

1
2
3
4
5
[1,2] == '0'                                            // true
function(){return ['1,2']}() == '1,2' // true

[1,2] === '0' // false
function(){return ['1,2']}() === '1,2' // false

3、 两个引用类型: 判断两者之间的引用路径。例如:

1
2
[1,2] == [1,2]                                          // false
[1,2] === [1,2] // false

总结

1、" == " 情况
一般转化规则:(对象 => 字符串 => 数字值) 或 (布尔值 => 数字值)
(1)字符串与数字比较时,字符串转化成数字值,二者再进行比较。
(2)布尔值与数字比较时,布尔值转化成数字值,二者再进行比较。
(3)字符串与布尔值比较时,二者全部转化成数字值再进行比较。
(4)对象与数字比较时,对象先转化成字符串,然后再转化成数字值,与数字值进行比较。
(5)对象与字符串比较时,对象转化成字符串,然后二者再进行比较。
(6)对象和布尔值比较时,对象先转化成字符串,然后再转化成数字值,布尔值直接转化为数字,二者再进行比较。
(7)nullundefined 二者相等,不能把二者转化为其他值,二者与其他值比较返回 false
(8)![] == []。(根据运算符的优先级,! 先执行,直接转化为布尔值(空字符串,NaN,0,null,undefined 都是 fasle,其余都是 true)再取反,故![] 转化为 false。其余依照以上规则转化。最后 0 == 0,故结果为 true。)

2、" === " 情况
(1)两个值类型不同,就返回 fasle
(2)两个值都是数值,并且是同一个值,那么为 true,另外:如果其中至少一个是NaN,那么为 fasle。(判断一个值是否是 NaN,只能使用 isNaN() 来判断);
(3)两个值都是字符串,每个位置的字符都一样,那么 true,否则 fasle
(4)两个值都引用同一个对象或函数,那么为true;否则 fasle
(5)两个值都是 truefasle,那么 true,否则 fasle
(6)两个值都是nullundefined,那么为true;否则 fasle

结论:推荐使用 “===”, 只要类型不一致,直接返回 fasle;“==” 会造成类型转换再进行比较, 不严谨。



支付宝打赏 微信打赏

欣赏此文,打赏一下



-->