资讯专栏INFORMATION COLUMN

前端碎碎念 之 为什么[] == ![] ?

isaced / 3091人阅读

摘要:判断步骤如下如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值转换为,而转换为。实际上是对比运用上面的顺序,是布尔值,所以转化为数值为。

『前端碎碎念』系列会记录我平时看书或者看文章遇到的问题,一般都是比较基础但是容易遗忘的知识点,你也可能会在面试中碰到。 我会查阅一些资料并可能加上自己的理解,来记录这些问题。更多文章请前往我的个人博客

类似标题中的问题还有很多,例如:

为什么 [ ] == false 而 !![ ] == true

or

[1] == [1] 是true 还是 false

如果对 == 操作符一知半解,就很难解答类似的问题。我们直接开门见山,看看==是如何工作的,这里的难点主要涉及到js中的隐式强制类型转换。

判断步骤如下:

如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值----false转换为0,而true转换为1。

如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值。

如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,如果得到的值不是基本类型值,则基于返回值再调用toString方法(这个过程即ToPrimitive),用得到的基本类型值按照前面的规则进行比较。

如果两个操作数都是对象,则比较他们是不是同一个对象。如果两个操作数指向同一个对象,则相等操作符返回true, 否则返回false。

这两个操作符在进行比较时则要遵循下列规则。

null 和 undefined 是相等的。

要比较相等性之前,不能将null和undefined转换成其他任何值

如果有一个操作数是NaN,则相等操作符返回false, 而不相等操作符则返回true, NaN != NaN

我画了一个图来表示这个过程:

根据上面的步骤,来分析[] == ![] 为什么会返回true

[] == ![]

!运算符的优先级大于 ==,所以实际上这里还涉及到!的运算。
这个比较简单!会将后面的值转化为布尔值。即![]变成!Boolean([]), 也就是!true,也就是false。

实际上是对比 [] == false;

运用上面的顺序,false是布尔值,所以转化为数值Number(flase), 为0。

对比[] == 0;

满足第三条规则[] 是对象(数组也属于对象),0不是对象。所以ToPrimitive([])是""

对比"" == 0;

满足第二条规则,"" 是字符串,0是数值,对比Number("") == 0, 也就是 0 == 0。

所以得出 [] == ![]

我们可以用同样的方法对上面提到的两个等式例子进行判断,都能得出结论。虽然过程有点麻烦,但是本质上就是将两边的比较值转化为数值进行比较。读者可以自行尝试实践。

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

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

相关文章

  • 前端碎碎 [] + {} 和 {} + []一样吗?

    摘要:前端碎碎念系列会记录我平时看书或者看文章遇到的问题,一般都是比较基础但是容易遗忘的知识点,你也可能会在面试中碰到。当两个操作数都是数值时,执行常规的数值加法计算。关键还是要加深对中对数值转换的理解,以不变应万变。 『前端碎碎念』系列会记录我平时看书或者看文章遇到的问题,一般都是比较基础但是容易遗忘的知识点,你也可能会在面试中碰到。 我会查阅一些资料并可能加上自己的理解,来记录这些问题...

    Soarkey 评论0 收藏0
  • 前端碎碎 nextTick, setTimeout 以及 setImmediate 三者的执行

    摘要:更多文章请前往我的个人博客这个问题是有关执行顺序和的。其中,整体代码,可以理解为待执行的所有代码。当队列执行完后再执行一个任务。然后再次回到新的事件循环。所以两个执行完后队列里只剩下第一个里的。 『前端碎碎念』系列会记录我平时看书或者看文章遇到的问题,一般都是比较基础但是容易遗忘的知识点,你也可能会在面试中碰到。 我会查阅一些资料并可能加上自己的理解,来记录这些问题。更多文章请前往我...

    Cciradih 评论0 收藏0
  • 盒模型的一些碎碎

    摘要:盒模型的简介本文简单的总结了一些基本概念,知识点以及细节问题作为前端人员,盒模型是最基础的知识点,在排版与布局时不可避免与盒模型打交道。 1. 盒模型的简介 本文简单的总结了一些基本概念,知识点以及细节问题 作为前端人员,盒模型是最基础的知识点,在排版与布局时不可避免与盒模型打交道。 在我们编写HTML时,网页上的内容几乎都是被包在一个个元素(当然也可以叫做标签)中的,最常见的有div...

    王伟廷 评论0 收藏0
  • 无关紧要的碎碎

    摘要:在美国和一些其他发达国家,程序员已经从一个相对高端的行业变成越来越多普通人的日常。是五十个编辑推荐话题之一软件开发者是美国四个州最常见的职业图片来源我们不难设想,把软件开发的工作自动化掉,对相关企业来说将会是一个多么巨大的诱惑。 在美国和一些其他发达国家,程序员已经从一个相对高端的行业变成越来越多普通人的日常。 JavaScript 是 Medium 五十个编辑推荐话题之一: http...

    wangjuntytl 评论0 收藏0

发表评论

0条评论

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