JavaScript中'==' 与 '==='的区别原理解析

在面试或者一些笔试题中经常会遇到相关的问题,例如:

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)

3.如果Type(x)与Type(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中判断两个变量请用 ‘===’

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值