先吐槽下谷哥的搜索,在搜索框中输入关键词"!!",没有搜索结果...,在度娘中这样搜索却能找到我想要的答案,然后segmentfault.com里面的搜索也是完全对"!!"关键词不作反应,最后安利下百度的 site:segmentfault !! 这种搜索方式,还是可以找到比较满意的资料的。
1. 关于 JavaScript 中的 !!
while(!!_tempNode && _tempNode.nodeType != 1){ _tempNode = _tempNode.nextSibling; }
是这段代码引起了我的注意,因为这里面 _tempNode 的取值只会是 null 或者是 Node对象,感觉这个 !! 出现的道理不是很明确。后来才发现这里的一个重要知识点,就是 !! 和 && / || 连用的情况。如果 && / || 连接两侧的数据类型都是 Boolean 类型,那么答案显而易见。但是一旦出现有不是 Boolean 类型的数值,却没有进行转换,就会出现想不通的情况。两者都遵循这样一个规律,有一个操作数不是布尔值的情况下,逻辑与、逻辑或(&&/||)就不一定返回 Boolean 类型的值。
(1). 逻辑与
- 如果第一个操作数是对象,则返回第二个操作数;
- 如果第二个操作数是对象,则只有在第一个操作数的求值结果是 true 的情况下才会返回该对象;
- 如果两个操作数都是对象,则返回第二个操作数;
- 如果有一个操作数是null / NaN / undefined,则返回null / NaN / undefined;
(2). 逻辑或
- 如果第一个操作数是对象,则返回第一个操作数;
- 如果第一个操作数的求值结果是false,则返回第二个操作数;
- 如果两个操作数都是对象,则返回第一个操作数;
- 如果两个操作数都是null / NaN / undefined,则返回null / NaN / undefined;
之前代码中的情况:“_tempNode && _tempNode.nodeType != 1”,如果没有 !! 带来的类型转换,这里就完全脱离了这行代码的本意。