js双等号探索(三): [] == false为True,而!![] == false为False ?

[] == false; //为True
!![] == false; //为False
复制代码

1、[] == false为True

第一步 转成[] == 0

根据 MDN Web 文档-比较操做符:developer.mozilla.org/zh-CN/docs/…javascript

0.png

若是其中一个操做数为布尔类型,那么布尔操做数若是为true,那么会转换为1,若是为false,会转换为整数0,即0。 因此![]false0.java

[] == 0
复制代码

第二步 转成"" == 0

根据 MDN Web 文档-比较操做符:developer.mozilla.org/zh-CN/docs/…git

image.png

若是一个对象与数字或字符串相比较,JavaScript会尝试返回对象的默认值。操做符会尝试经过方法valueOf和toString将对象转换为其原始值(一个字符串或数字类型的值)。 因此[].valueOf().toString()""github

"" == 0
复制代码

第三步 转成0 == 0

根据 MDN Web 文档-比较操做符:developer.mozilla.org/zh-CN/docs/…app

image.png

当比较数字和字符串时,字符串会转换成数字值。 JavaScript 尝试将数字字面量转换为数字类型的值。 Number("")0ui

0 == 0
复制代码

最后0==0True,因此[] == falseTurespa

2、!![] == false为False

第一步 先运行!![]

根据 MDN Web 文档-运算符优先级:developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence 设计

感叹号.png

等号.png

!的优先级为16 ,==的优先级为10!的优先级更高,因此先运行!![]code

!![]
复制代码

第二步 先运行!false

根据 **《Javascript高级程序设计》**这本书第44页中逻辑非的说明: cdn

!.jpeg

若是操做数是一个对象,返回false

因此运行!false,为True

!false //为True
复制代码

最后true == falseFalse,因此!![] == falseFalse

[] == falseTrue!![] == falseFalse

其余连接

Happy coding ..

相关文章
相关标签/搜索