很抱歉被问到并回答了,但我所有的搜索都返回了关于逻辑OR的信息,并且没有澄清情况。
我完全理解大多数语言中的"|"one_answers"||",但这让我陷入了一个循环。我接触过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、0等则返回"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;
:
来自MDN:
expr1 || expr2
(逻辑或)如果可以转换为
true
,则返回expr1
;否则返回expr2
。因此,当与布尔值一起使用时,如果任一操作数是true
,则||返回true
;如果两者都是false
,则返回false
。
它将首先计算表达式的左侧,如果结果可以转换为true
,它就到此为止。否则,它将计算并返回表达式的右侧。
换句话说,它既可以用作一种控制结构,也可以用作布尔或运算符。它可以作为类似的简写
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
||
是一个惰性逻辑OR运算符。两个表达式都通过ToBoolean
转换为布尔值;如果ToBoolean(a)
为false,则b
表达式仅为。
a || b
的结果始终是a
或b
表达式的值,根据此TTL:
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
函数确定一个值的"真实性"。"真诚"的价值观是:
- 有限数,0除外
- 长度大于0的字符串
- 真的
- 所有对象,包括空数组(
null
和undefined
是对象,而不是对象!)
另一方面,|
是按位"或"运算。它急切地通过ToInt32
转换操作数,并执行逐位"或"运算。|
的结果始终是范围[-2^31, 2^31)
中的数字,其不需要是输入值中的任何一个。
看看"聪明"的代码(添加的括号不会改变优先级),我们从开始
return self.innerHeight ||
(jQuery.boxModel && document.documentElement.clientHeight) ||
document.body.clientHeight;
有了替代(这是论文的替代,因为使用变量分配会强制评估),看起来像:
return a || b || c; // or, return (a || b) || c
这句话是"返回第一个‘truthy’值",懒洋洋地评价。
由于b
是boxModel && documentElement.clientHeight
,所以增加了一些复杂性,但&&
的工作方式与||
相同(TTL除外),并返回其中一个输入表达式的求值。在这种情况下,这意味着当boxModel
是truthy(即true
)和clientHeight
是truthy-(即不是0)时,b
只是truthy的(因此是a || b || c
的结果,其中a
不是truthy):如果b
有truthy结果,那么它必须是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)
如上所示,因为这可能会变得复杂,所以我通常会避免||
和&&
运算符在表达式中交织在一起的构造,因为表达式所使用的不仅仅是计算出的"布尔"真实性。
评论中的链接很好,但简单地放在第一个例子中:
在大多数情况下,我理解"a=a||document;"如果其中一个有效,则返回"true",如果两者都为null、0等则返回"false"。
实际上读起来是:
如果"a"是"truthy",则将"a"设置为"a"。。。如果"a"不是"truthy",则将"a"设置为"document"。
只有在变量尚未初始化的情况下,这通常被用作初始化变量的方法。。。或者还用于初始化对象的属性(如果尚未设置)。。。例如
myObj[key] = myObj[key] || {};
关于||和&;他们"早出晚归"。。。因为他们会尽快停下来。。。所以你可以想象一下:
a=a||b||c||d
如果a已经被设置为某个值,那么它只会得到这么远的"a=a"。。。如果"a"是假的,那么它会检查b…等等…
因此,如果你记得利用他们提前退出的事实,他们是很好的。
||与类C语言不同。||运算符序列的值是第一个可以计算为true的操作数(通常称为truthy值)。有一些值不被认为是truthy(空字符串、null、未定义、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/
这是一个可以帮助您理解它的例子:
var objOne = true, objTwo = false, objOR;
objOR = objOne || objTwo; // true
所以现在objOR
仅在objOne
和objTwo
都为假时等于假。就你的情况而言,我认为你需要在2子句和3子句之间加一个括号&和||。像这样:
(jQuery.boxModel && document.documentElement.clientHeight) ||
document.body.clientHeight;