我正在查看一段检测IE浏览器的代码:
if (false || !!document.documentMode)
我不理解这个装置。为什么有必要使用OR和false并使用NOT两次?
如果我只是在IE9,FF或Opera中加载下面的文件,那么IE会告诉我文档模式是存在的,而后两者会说不然:
<html>
<head>
<script>function ld() {
if (document.documentMode){
document.getElementById("p1").innerHTML = 'Document Mode detected'
}
else {
document.getElementById("p1").innerHTML = 'No Document Mode'
}
}</script>
</head>
<body onload="ld()">
<p id="p1"></p>
</body>
</html>
这还不够吗?为什么?目前尚不清楚,因为如果我用原始问题中的条件替换条件,结果将完全相同。我错过了什么?
答案 0 :(得分:2)
为什么有必要与假[...]
进行OR
没有必要。 ||
operator,第一个操作数为false
,will always return the 2nd operand。
// lval || rval (minus short-circuiting)
function OR(lval, rval) {
if (lval)
return lval;
else
return rval;
}
OR(false, 'foo') // 'foo'
[...]并且不使用两次?
这部分already has an answer here on SO。
两个!
operators一起执行&#34; ToBoolean&#34;类型转换,作为使用Boolean()
without new
的更简短的版本:
!!document.documentMode // true/false
Boolean(document.documentMode) // true/false
此外,if
will perform the same type conversion本身。
2. If ToBoolean(GetValue(exprRef)) is true
因此,在为真实性测试单个值时,!!
也不一定如你所建议的那样:
if (document.documentMode)
答案 1 :(得分:1)
由于始终定义document
,并且其属性documentMode
的存在是真实的,因此这些完全是同义词:
if (false || !!document.documentMode)
和
if(document.documentMode)
(如果document
可能未定义,则第一个代码将完全失败。)