以下代码来自'JavaScript by Example Second Edition'示例15.24
我不明白代码var evt = e || window.event; //浏览器差异
我认为var evt应该是true或false,所以evt.target应该为null,对吗?
function colorText(e){
var evt = e || window.event; //Browser differences
var evtTarget= evt.target || evt.srcElement;
if(evtTarget.id=="first"){
div1.className="red";
}
else if(evtTarget.id == "second"){
div2.className="blue";
}
else{ div3.className="green";}
}
答案 0 :(得分:4)
到目前为止,所有答案在技术上都是正确的。全文:
||如果将其转换为布尔值的结果为truthy,则operator返回第一个操作数的值。否则,它返回第二个操作数的值。 ES5 Spec
许多不同的值都是“假的”,包括null和undefined。 Nailing down exactly what falsy is can be tricky,但您可以依赖它们,这对于捕获可能不存在于不同浏览器中的变量和属性非常有用。但是,如果你想自己检查一个未定义的变量,通常最好使用typeof。
答案 1 :(得分:2)
如果未设置e
,表示您未使用参数调用该函数,则evt
将为window.event
。如果设置了e
,那么evt
将是e
的任何内容。
有一个称为short circuit evaluation的概念,这意味着如果在没有完全评估条件的情况下满足条件,则不需要对其进行全面评估。这就是这种情况。如果设置了e
,则您不关心window.event
是什么,因为您已经拥有可以evt
设置的内容。
答案 2 :(得分:1)
不,在JavaScript中||不会强制转换为布尔值,而是将其永久值(从左到右)的短路首先评估为真值。
它保留了表达式的评估。
答案 3 :(得分:1)
var evt = e || window.event;
如果e不为空,则此行将变量evt设置为e。否则(如果e为null,例如,如果e未传递给此函数),则evt设置为window.event。
答案 4 :(得分:1)
关键字表达式返回第一个表达式操作数的值,如果它不是 null falsey,否则返回值第二
Javascript是弱类型的,所以你总是可以使用||作为布尔值,因为不是false或null的所有内容都计算为true。但它确实在这里返回了值,s 。因此evt
变为e
(参数)或如果e
不存在具有假值,则变为window.event
。