前端碎碎念 之 为何[] == ![] ?

『前端碎碎念』系列会纪录我日常平凡看书或许看文章遇到的题目,平常都是比较基础然则轻易忘记的知识点,你也能够会在口试中遇到。 我会查阅一些材料并能够加上本身的明白,来纪录这些题目。更多文章请前去我的个人博客

相似标题中的题目另有许多,比方:

为何 [ ] == false 而 !![ ] == true

or

[1] == [1] 是true 照样 false

假如对 == 操作符一孔之见,就很难解答相似的题目。我们直接直言不讳,看看==是怎样事情的,这里的难点重要涉及到js中的隐式强迫范例转换。

推断步骤以下:

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

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

  3. 假如一个操作数是对象,另一个操作数不是,则挪用对象的valueOf()要领,假如获得的值不是基础范例值,则基于返回值再挪用toString要领(这个历程即ToPrimitive),用获得的基础范例值依据前面的划定规矩举行比较。

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

这两个操作符在举行比较时则要遵照以下划定规矩。

  1. null 和 undefined 是相称的。

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

  3. 假如有一个操作数是NaN,则相称操作符返回false, 而不相称操作符则返回true, NaN != NaN

我画了一个图来示意这个历程:

《前端碎碎念 之 为何[] == ![] ?》

依据上面的步骤,来剖析[] == ![] 为何会返回true

[] == ![]

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

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

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

对照[] == 0;

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

对照"" == 0;

满足第二条划定规矩,”” 是字符串,0是数值,对照Number(“”) == 0, 也就是 0 == 0。

所以得出 [] == ![]

我们能够用一样的要领对上面提到的两个等式例子举行推断,都能得出结论。虽然历程有点贫苦,然则本质上就是将双方的比较值转化为数值举行比较。读者能够自行尝试实践。

    原文作者:fwon
    原文地址: https://segmentfault.com/a/1190000008594792
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞