我需要帮助理解javascript ||。它是否是逻辑'或'

时间:2013-12-14 03:41:00

标签: javascript

很抱歉,如果被询问和回答,但我的所有搜索都会返回有关逻辑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;
:

5 个答案:

答案 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的结果始终是ab表达式的值:

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”的价值观是:

  • 有限数字,0
  • 除外
  • 字符串长度&gt; 0
  • 所有对象,包括空数组(nullundefined都是不是对象!)

另一方面,|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

这说“退回第一个'真实'的价值”,懒洋洋地评价。

由于bboxModel && 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

因此,当objORobjOne均为假时,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/