DingMing

丁大铭的个人空间,用来分享一些前端小技巧,默默成长吧,哈哈

==-和-===的区别

  |  
 阅读次数

常人理解是:

1
2
3
4
5
6
7
8
 == 是相等 值相等,返回true
=== 是全等 值相等 , 类型也相等,返回就是 true
这个理解是错的 []== false => true
[1]===[1] => false 推翻上面的理念
初级解释
真确的理解
== 是 相等 先转换再比较, 返回true
=== 是 全等 不转化就比较 , 返回true

初级进阶

1
2
3
4
5
6
7
1.如果有一个操作数是布尔值,则在比较前先将其转换为数值,true转换为1,false转换为0,例如false == 0,true == 1
2.如果一个操作数是字符串,另一个操作数是数值,先将字符串转换成数值,例如"1"==1,'' ==0
3.如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型按照前面的规则进行比较。(解释不清楚)
4.null和undefined是相等的。
5.如果有一个数是NaN,则相等操作符返回false,而不想等操作符返回true。NaN == NaN返回为false,因为规则如此。
6.如果两个操作数是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true,否则返回false。
例如:var obj = {a:1};foo = obj;bar = obj;foo==bar;foo==bar返回为true,因为他们指向同一个对象,obj

高级解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[] == fasle => true
== 有 强制转换的 作用
1. [] ==false => [] == 0
经过ToNumber(false),false会被转换为0.
2. [] == 0 => ''==0
[].valueOf().toString() => []=> ''
3. '' == 0 => 0 == 0


[1] === [1] =>false
再来看下===操作符,其中有句话可以完美解释[1]===[1]返回false,但是var obj = {a:1};foo = obj;bar = obj;foo===bar中foo===bar返回为true的原因。

由于[1]===[1]三等号左右的[1],不是same Object,因此返回为false.

而foo===bar,三等号左右其实本质上都是指向obj这个对象,值相等更是必然,所以返回为true。我们由此可以举一反三,[1]==true返回true,而[1,2,3]==true返回false的原因也不足为奇了。