资讯专栏INFORMATION COLUMN

你真的理解==和===吗

Barrior / 2740人阅读

摘要:开门见题说出以下几个表达式的结果张三张三补充知识要想回答上述问题,必须理解在执行时候的一些数据转换规则和成文的规定。根据上面第二条,写的明明白白,结果是。。根据,由于和指向不同引用,所以返回。

开门见题

说出以下几个表达式的结果

var obj1 = { name: "张三"}
var obj2 = obj1
var obj3 = { name: "张三"}

null == undefined
123 == "123"
false == 0
NaN == false
obj1 == obj2
obj1 == obj3
补充知识

要想回答上述问题,必须理解js在执行==时候的一些数据转换规则和成文的规定。ECMA-262对==的约定如下:

x==y

如果x和y的类型相同,

如果x是undefined,return true

如果x是null,return true

如果x是Number

x是NaN,return false

y是NaN,return false

x,y数值相同,return true

x是+0,y是-0,return true

x是-0,y是+0,return true

如果x是String,y必须和x长度内容都相同才return true,否则return false

如果x是Boolean,x,y相同return true,否则return false

如果x,y引用同一个对象,return true,否则return false

x是null,y是undefined,return true

x是undefined,y是null,return true

x是Number,y是String,return x == ToNumber(y)

x是String,y是Number,return ToNumber(x) == y

x是Boolean,return ToNumber(x) == y

y是Boolean,return x == ToNumber(y)

x是String或Number,y是Object,return x == ToPrimitive(y)

x是Object,y是String或Number,return ToPrimitive(x) == y

return false

你可能注意到了这样两个函数

ToNumber()
参数类型 结果
Undefined NaN
Null +0
Boolean true为1,false为+0
Number 参数本身
String 简单理解,能转换成数字的就会转换成数字,比如数字字符串,十六进制的数字等,转换失败则返回NaN(详见ECMA-262-9.3.1,内容较多,不展开叙述)
Object 两步转换操作:1. ToPrimitive(input argument, hint Number) 2. ToNumber()
ToPrimitive()
参数类型 结果
Undefined 输入值
Null 输入值
Boolean 输入值
Number 输入值
String 输入值
Object 调用DefaultValue方法

好吧,又多了一个DefaultValue方法

ToPrimitive()

细心的你发现上面ToNumber对于Object的转换里有这么一句ToPrimitive(input argument, hint Number),就是说调用ToPrimitive的时候,除了传入要转化的值,还传了一个hint参数,这个参数可以为Number,也可以为String。那么什么时候传入这两个参数,同时又有啥区别?

如果参数是hint Number:

先执行valueOf,如果返回值是原始值,则返回原始值

否则执行toString,如果返回值是原始值,则返回原始值

报错

如果参数是hint String:

先执行toString,如果返回值是原始值,则返回原始值

否则执行valueOf,如果返回值是原始值,则返回原始值

报错

如果input argument是内置的Date类型,则参数是hint String,否则默认hint Number

回到题目

说了这么多,我们回到上面的题目,一一解答:

null == undefined。根据上面第二条,写的明明白白,结果是true。

123 == "123"。根据上面第四条return 123 == ToNumber("123"),而ToNumber("123")的结果为123,所以return 123 == 123,根据1-3-3,返回true。

false == 0。根据上面第六条,return ToNumber(false) == 0,而ToNumber(false)的值为+0,所以+0 == 0,根据1-3-3,返回true。

NaN == false。看到很多别的同学说这里是做了各种类型转换,其实我认为这里是由于没有匹配到任何规则,所以根据第十条返回false,也就是说并没有做什么类型转换。

obj1 == obj2。根据1-6,由于obj1和obj2指向同一个引用,所以返回true。

obj1 == obj3。根据1-6,由于obj1和obj2指向不同引用,所以返回false。

关于===

把上面题目中的==换成===,试问结果会发生怎样的变化?这里我就不说了,推理方式同上,根据如下规则,答案请各位看官自行补充。

x===y

如果x,y类型不同,return false

如果x是undefined,return true

如果x是null,return true

如果x是Number

如果x是NaN,return false

如果y是NaN,return false

x,y数值相同,return true

x是+0,y是-0,return true

x是-0,y是+0,return true

return false

如果x是String,y必须和x长度内容都相同才return true,否则return false

如果x,y引用同一个对象,return true,否则return false

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/108110.html

相关文章

  • 大话-node真的是单线程

    摘要:当你使用的活动监视器你会发现,实际的进程数为菜鸟是因为线程池的原因吗老鸟不错嘛,还知道线程池呢但非也非也。菜鸟竟然不是线程池老鸟你忽视了集成了引擎。启动后会创建实例,而实例是多线程的。 老鸟:伸着懒腰,看着窗外明媚的阳光,喝一口清茶,心情大美。一天的好心情莫过于此。老鸟:菜鸟,你这消失了大半个月,忙什么呢?菜鸟:听说node最近很火,这不趁着年轻,多储存点知识储备呢!老鸟:那你说说你对...

    Yang_River 评论0 收藏0
  • CSS魔法堂:真的理解z-index

    摘要:与的映射关系为。与根对应的对应的层叠上下文,是其他的祖先,的范围覆盖整条。注意的默认值为,自动赋值为。对于,它会将赋予给对应的,而则不会。 一、前言                                假如只是开发简单的弹窗效果,懂得通过z-index来调整元素间的层叠关系就够了。但要将多个弹窗间层叠关系给处理好,那么充分理解z-index背后的原理及兼容性问题就是必要的知识...

    andycall 评论0 收藏0
  • 真的理解机器学习中偏差 - 方差之间的权衡

    摘要:机器学习中的偏差方差之间的权衡机器学习全部是关于给定输入数据和给定输出数据,然后去寻找一个最佳映射函数,这个映射函数通常也被叫做目标函数。 作者:chen_h微信号 & QQ:862251340微信公众号:coderpai简书地址:http://www.jianshu.com/p/f143... 我认为对偏差 - 方差之间的权衡判读对学习机器学习是非常重要的。那么为什么这么说呢?因为...

    lastSeries 评论0 收藏0
  • 真的理解=====的区别

    摘要:上面的理解是错的,和返回就可以推翻。解释不清楚和是相等的。和的规则类似,唯一少了转换的一步。三高级阶段参考规范真正理解真的如高设所说的那样吗其实不然。来分析一个经典的例子,看完彻底理解的强制转换。 showImg(https://segmentfault.com/img/remote/1460000011658462?w=512&h=321); 用中文怎么叫合适?相等?全等?其实并不合...

    TwIStOy 评论0 收藏0
  • 真的理解事件冒泡事件捕获

    摘要:事件流是事件冒泡,而的事件流就是事件捕获。所有现代浏览器都支持事件冒泡,并且会将事件一直冒泡到对象。事件捕获的用以在于事件到达预定目标之前捕获它。事件流级事件规定事件流包括三个阶段,事件捕获阶段处于目标阶段和事件冒泡阶段。 最近在复习前端的基础,看到事件这一节的时候,刚好发现了笔记中一道特别好玩并且十分有趣的代码,根据这么一道题目,基本上能够把事件冒泡和事件捕获的盲区给扫空。本文就带你...

    Cheriselalala 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<