由[]==![]说开去

一个挺有意思的题目,起初觉得没有多麻烦,后来经过查阅发现里面东西还不算少,特此记录一下:

[] == ![]

1、首先要注意的是运算符的优先级,需要的知识点:运算符优先级 - MDN 大致总结记忆有 单目运算符优先级 大于 双目及以上;算术运算符(+-*/) 大于 比较运算符(<>) 等。

由此可以得出 ![]首先进行运算。

2、![] 依照如下两条规则:
Logical NOT Operator ( ! )
ToBoolean

上述两条规则,向我们讲述了两点,一、! 取反操作要对旧值进行ToBoolean操作;二、ToBoolean操作会将object转换为true;

在这里有一点自己的小疑惑,这里不是空数组么,不依照null的规则转换为false?

稍稍想了下,ToBoolean会将object转换为true,将null转换为false,这里的数组虽然为空,但空数组 并不等于null。

由此,![] 的结果为false。

3、== 的比较行为

The Abstract Equality Comparison Algorithm

按照以上规则的第七条和第九条,对右侧的 false 调用 ToNumber() ,对左侧的 [] 对象 调用 ToPrimitive() 并将其转换为原始值;

于是,右侧被转换为 0;左侧的空数组被转换为空字符串,然后再被转换为 0;

于是 0 == 0;  //true

小结一下:

以后规范性的东西还是要看原始文档:

MDN https://developer.mozilla.org/zh-CN/docs/Web/Tutorials

Standard ECMA-262 http://www.ecma-international.org/ecma-262/5.1/index.html

posted on 2015-05-25 18:24  _blank  阅读(149)  评论(0编辑  收藏  举报

导航