== 表明相同, ===表明严格相同,javascript
进一步解释: 当进行双等号比较时候: 先检查两个操做数数据类型,若是相同, 则进行===比较, 若是不一样, 则进行一次类型转换, 转换成相同类型后再进行比较, 而===比较时, 若是类型不一样,直接返回false.前端
根据具体须要,JavaScript 按照以下规则将变量转换成布尔类型:java
false
、0
、空字符串(""
)、NaN
、null
和undefined
被转换为false
- 全部其余值被转换为
true
上述两段话你们应该都知道,被问到也都能答上来。函数
问:1 == true 返回什么?post
答:trueui
问:2 == true 返回什么?spa
答:falsecode
你的脑子里可能会想, 2转成boolean
不是true
么?可是,实际上,当boolean
与number
作双等判断时,是将true
转成1再与数字作比较cdn
若是你不知道这个,那就浪费5分钟看一下下文吧~对象
记笔记:
NaN === NaN // false
+0 === -0 // true
等式
(x !== x)
成立的惟一状况是 x 的值为 NaN)
在比较前将两个被比较的值转换为相同类型。在转换后(等式的一边或两边均可能被转换)
若是没法转成同类型就报错
ECMAS实现双等的抽象比较的逻辑以下:
x == y
x 与 y 类型相同
a. Type(x) 为 undefined,返回true
b. Type(x) 为 null,返回true
c. Type(x) 为 number,则
i. x 为NaN,返回false
ii. y 为NaN,返回false
iii. x 与 y的值相等,返回 true
iv. x = +0, y = - 0, 返回true
v. 返回 false
复制代码
d. 若是 Type(x) 为 string, y 为与 x 一致的字符串,返回 true, 不然返回 false
e. Type(x) 为 number,判断是否都是true或者false
f. Type(x) 为对象, x 和 y 指向同一对象时返回true,不然返回 false
x 为 null,y 为 undefined, 返回 true
x 为 undefined,y 为 null, 返回 true
数字 == 字符串,string 转成number
boolean == any, boolean 转成 number, 而后从新进行双等比较
字符串 == 对象 或 数字 == 对象, 调用 ToPrimitive(object) 转成 string 或 number
返回 false
ToPrimitive(A)
经过尝试调用 A 的A.toString()
和A.valueOf()
方法,将参数 A 转换为原始值(Primitive)。
ToNumber(A)
尝试在比较前将参数 A 转换为数字,这与 +A(单目运算符+)的效果相同。
上图说话,按从上到下的逻辑执行:
相等操做符对于不一样类型的值,进行的比较以下图所示:
被比较值 B | |||||||
---|---|---|---|---|---|---|---|
Undefined | Null | Number | String | Boolean | Object | ||
被比较值 A | Undefined | true |
true |
false |
false |
false |
IsFalsy(B) |
Null | true |
true |
false |
false |
false |
IsFalsy(B) |
|
Number | false |
false |
A === B |
A === ToNumber(B) |
A=== ToNumber(B) |
A== ToPrimitive(B) |
|
String | false |
false |
ToNumber(A) === B |
A === B |
ToNumber(A) === ToNumber(B) |
ToPrimitive(B) == A |
|
Boolean | false |
false |
ToNumber(A) === B |
ToNumber(A) === ToNumber(B) |
A === B |
ToNumber(A) == ToPrimitive(B) | |
Object | false | false | ToPrimitive(A) == B |
ToPrimitive(A) == B |
ToPrimitive(A) == ToNumber(B) | A === B |
例子
var num = 0;
var obj = new String("0");
var str = "0";
var b = false;
console.log(num == num); // true
console.log(obj == obj); // true
console.log(str == str); // true
console.log(num == obj); // true
console.log(num == str); // true
console.log(obj == str); // true
console.log(null == undefined); // true
// both false, except in rare cases
console.log(obj == null);
console.log(obj == undefined);
复制代码
有些开发者认为,最好永远都不要使用相等操做符。全等操做符的结果更容易预测,而且由于没有隐式转换,全等比较的操做会更快。
小知识:
Object.is(a,b)
判断a与b是否彻底相等,与===基本相同,不一样点在于Object.is判断+0不等于-0
,NaN等于自身
若是你收获了新的知识,请给做者点个赞吧~
相关系列: 从零开始的前端筑基之旅(超级精细,持续更新~)
参考文档