很抱歉,如果被询问和回答,但我的所有搜索都会返回有关逻辑OR的信息,但不会澄清情况。
我完全理解'|' vs'||'在大多数语言中,但这让我陷入了困境。我已经接触过javascript,但我对此知之甚少,以下代码让我感到困惑。
:
a = a || document;
// HANDLE: $(function)
// Shortcut for document ready
if ( jQuery.isFunction(a) )
return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( a );
:
在大多数情况下,我理解“a = a || document;”如果有效则返回'true',如果两者都为null,则返回false等等......
我在以下代码中遇到同样的问题。
:
jQuery.fn.height = function() {
if ( this[0] == window )
return self.innerHeight ||
jQuery.boxModel && document.documentElement.clientHeight ||
document.body.clientHeight;
if ( this[0] == document )
return Math.max( document.body.scrollHeight, document.body.offsetHeight );
return this._height(arguments[0]);};
:
以下结果如何导致高度值?还是吗?
:
if ( this[0] == window )
return self.innerHeight ||
jQuery.boxModel && document.documentElement.clientHeight ||
document.body.clientHeight;
:
答案 0 :(得分:4)
来自MDN:
expr1 || expr2
(逻辑OR)如果可以转换为
expr1
,则返回true
;否则,返回expr2
。因此,当与布尔值一起使用时,||如果任一操作数为true
,则返回true
;如果两者都是false
,则返回false
。
它将首先评估表达式的左侧,如果结果可以转换为true
,它将停在那里。否则,它将评估并返回表达式的右侧。
换句话说,它可以用作一种类型的控制结构以及一个布尔OR运算符。它可以用于像这样的简写
var result = <expr1>;
if (!result) result = <expr2>;
文档继续提供一些有用的示例:
var o1 = true || true; // t || t returns true
var o2 = false || true; // f || t returns true
var o3 = true || false; // t || f returns true
var o4 = false || (3 == 4); // f || f returns false
var o5 = "Cat" || "Dog"; // t || t returns Cat
var o6 = false || "Cat"; // f || t returns Cat
var o7 = "Cat" || false; // t || f returns Cat
答案 1 :(得分:2)
||
是 lazy logical OR operator。两个表达式都通过ToBoolean
转换为bool值;如果b
为假,ToBoolean(a)
表达式仅进行评估。
根据此TTL,a || b
的结果始终是a
或b
表达式的值:
ToBoolean(a) ToBoolean(b) a || b
------------ --------------- -------------------------
true (Not Evaluated) a (ToBoolean(a) == true)
true (Not Evaluated) a (ToBoolean(a) == true)
false true b (ToBoolean(b) == true)
false false b (ToBoolean(b) == false)
ToBoolean
函数确定值的"truthiness"。 “Truthy”的价值观是:
null
和undefined
都是不是对象!)另一方面,|
是bitwise OR operation。它急切地通过ToInt32
转换操作数并执行按位OR运算。 |
的结果始终是[-2^31, 2^31)
范围内的数字,不必是任何一个输入值。
查看“聪明”代码(添加的括号不会改变优先级),我们从:
开始return self.innerHeight ||
(jQuery.boxModel && document.documentElement.clientHeight) ||
document.body.clientHeight;
其中,替换(这是纸张替代品,因为使用变量赋值会强制评估),如下所示:
return a || b || c; // or, return (a || b) || c
这说“退回第一个'真实'的价值”,懒洋洋地评价。
由于b
为boxModel && documentElement.clientHeight
,因此有一些额外的复杂性,但&&
的工作方式与||
的工作方式相同(除了TTL)并返回一个评估输入表达式。在这种情况下,这意味着当b
真实时(a || b || c
a
只是真实的(因此boxModel
的结果true
不是真的) )和 clientHeight
是真实的(即不是0):如果b
存在真实结果,那么它必须是clientHeight
的值。
查看压缩的TTL也可能会有所帮助,其中“*”表示“不关心”,而T / F表示Truthy / Falsey值(根据ToBoolean):
a = self.innerHeight
b1 = jQuery.boxModel
b2 = document.documentElement.clientHeight
c = document.body.clientHeight;
a b1 b2 b (b1 && b2) c a || b || c
---- ---- ---- ------------ ---- -----------
T * * * * a (T)
F T T b2 (T) * b2 (T)
F T F b2 (F) * c (T or F)
F F * b1 (F) * c (T or F)
因为这可能变得复杂,如上所示,我通常会避免使用||
和&&
运算符交织在一个表达式中的结构,该表达式用于计算“boolean”真实性。 / p>
答案 2 :(得分:0)
评论中的链接很好,但只是放在第一个例子中:
在大多数情况下,我理解“a = a || document;”如果有效则返回'true',如果两者都为null,则返回false等等......
实际上读作:
如果“a”是“真实的”,则将“a”设置为“a”...如果“a”不是“truthy”,则将“a”设置为“document”。
这通常用作初始化变量的方法,只有当它尚未初始化时...或者还用于初始化对象的属性(如果尚未设置)...例如
myObj[key] = myObj[key] || {};
关于||的另一件好事和&amp;&amp;是他们“早早出来”......因为他们尽快停止......所以你可以想象这个:
a = a || b || c || d
如果a已经被设置为某种东西它只能得到这个“a = a”...如果“a”是假的那么它会检查b ...等...
如果你记得利用他们提前纾困的事实,他们就会很好。
答案 3 :(得分:0)
这个例子可能有助于您理解它:
var objOne = true, objTwo = false, objOR;
objOR = objOne || objTwo; // true
因此,当objOR
和objOne
均为假时,objTwo
仅等于false。在你的情况下,我认为你需要在2条款和&amp;&amp;和和||。像这样:
(jQuery.boxModel && document.documentElement.clientHeight) ||
document.body.clientHeight;
答案 4 :(得分:0)
||在JavaScript中与C语言不同。 ||序列的值运算符是第一个可以求值为true的操作数(通常称为truthy值)。有一些值不被认为是真实的(空字符串,null,undefined,0,NaN,false)。其他一切都是真实的
例如,var x = false || undefined || 1 || "5";
的计算结果为1. false和undefined是非真的,“5”被忽略,因为表达式评估没有“达到那么远”并且停在1处。
有关详细信息,请参阅这些链接。
http://www.sitepoint.com/javascript-truthy-falsy/
http://helephant.com/2008/12/09/javascript-null-or-default-operator/