在面试或者一些笔试题中经常会遇到相关的问题,例如:
console.log(0 == '') true?false
console.log(0 == ' ') true?false
console.log(0 == null) true?false
console.log(undefined == null) true?false
console.log(0 === '') true?false
console.log(undefined === null) true?false
console.log(1 === new Number(1)) true?false
console.log(1 == new Number(1)) true?false
很多人乍一看可能一头??????那这他俩到底有啥区别呢,让我们直接看一下官方的规格说明书(详细描述语法规则和实现方法)
‘===’ 规格说明如下
1.如果Type(x)与Type(y)不同,则返回false
2.如果Type(x)是Undefined,则返回true。
3.如果Type(x)为Null,则返回true。
4.如果Type(x)是Number,那么
a.如果x是NaN,则返回false。
b.如果y是NaN,则返回false。
c.如果x与y的 Number值相同,则返回true。
d.如果x为+0且y为-0,则返回true。
e.如果x是-0且y是+0,则返回true。
f.Return false.
5.如果Type(x)是String,那么
a.如果x和y完全相同的代码单元序列(相应索引处的长度和代码单元相同),则返回true。
b.否则,返回false。
6.If Type(x) is Boolean, then
a.如果x和y都为true或两者都为false,则返回true。
b.否则,返回false。
7.如果x和y是相同的Symbol值,则返回true。
8.如果x和y是相同的Object值,则返回true。
9.Return false.
‘==’规格说明如下
1.ReturnIfAbrupt(x)
2.ReturnIfAbrupt(y)
a.返回执行Strict Equality Comparison x === y的结果。
4.如果X是零和ÿ是undefined,返回true
5.如果X是undefined和Ÿ为null,返回true
6.如果Type(x)是Number而Type(y)是String,则
返回比较结果 x == ToNumber(y)
7.如果Type(x)是String而Type(y)是Number,则
返回比较结果ToNumber(x)== y。
8.如果Type(x)是布尔值,则返回比较结果 ToNumber(x)== y。
9.如果Type(y)是布尔值,则返回比较结果 x == ToNumber(y)。
10.如果Type(x)是String,Number或Symbol而Type(y)是Object,则
返回比较结果 x == ToPrimitive(y)。
11.如果Type(x)是Object而Type(y)是String,Number或Symbol,则
返回比较结果ToPrimitive(x)== y。
12.Return false
规格中的提到Type(),ToNumber()等方法内部方法,与typeOf不是同一个,有兴趣的大神可以去规格书中好好研究研究。
对于‘===’比较好理解和记忆,只要类型不同,两个变量就不同,如果类型相同,再进行值的比较,其中需要特别注意的三个点,
1.NaN(not a number) 与任何类型的值都不相等,包括自己 NaN ==(===) NaN(false),es6中可以用isNaN(vari)来判断一个变量是否是NaN.
2.Symbol类型的判断,Symbol是es6中新增加的类型
学习地址http://es6.ruanyifeng.com/#docs/symbol
3.Object类型,只要两个变量指向同一个Object,就相等
‘==’ 会比较复杂一点,因为‘==’在比较的过程中涉及到了,变量的类型转换。
注意点
1.如果两个变量的类型相同,则按照‘===’的规则进行比较
2.第四、五条不具有传递性,虽然0 == undefined, undefined == null 但是0 != null
3.第十、十一条(一样),如果x是String,Number,Symbol类型,y是Object,比较是会对y进行ToPrimitive(y)处理,就是获取y的原始值(可以简单的理解为,y调用valueOf()或toString()后返回的值,具体的可以到规格说明里看一下
至此,各位大神开头的题目能不能给出正确答案?
友情提示,在js中判断两个变量请用 ‘===’