我需要帮助理解javascript||.这是一个逻辑'或者'是否

I need help understanding javascript ||. Is it a Logical 'OR' or not

本文关键字:一个 是否 或者 助理 帮助 javascript      更新时间:2023-09-26

很抱歉被问到并回答了,但我所有的搜索都返回了关于逻辑OR的信息,并且没有澄清情况。

我完全理解大多数语言中的"|"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的结果始终是ab表达式的值,根据此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的字符串
  • 真的
  • 所有对象,包括空数组(nullundefined对象,而不是对象!)

另一方面,|是按位"或"运算。它急切地通过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’值",懒洋洋地评价。

由于bboxModel && documentElement.clientHeight,所以增加了一些复杂性,但&&的工作方式与||相同(TTL除外),并返回其中一个输入表达式的求值。在这种情况下,这意味着当boxModel是truthy(即trueclientHeight是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] || {};

关于||和&amp;他们"早出晚归"。。。因为他们会尽快停下来。。。所以你可以想象一下:

a=a||b||c||d

如果a已经被设置为某个值,那么它只会得到这么远的"a=a"。。。如果"a"是假的,那么它会检查b…等等…

因此,如果你记得利用他们提前退出的事实,他们是很好的。

JavaScript中的

||与类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仅在objOneobjTwo都为假时等于假。就你的情况而言,我认为你需要在2子句和3子句之间加一个括号&和||。像这样:

(jQuery.boxModel && document.documentElement.clientHeight) ||
        document.body.clientHeight;
相关文章: