2010-12-15 40 views
10

在JavaScript中,如果我們有一些代碼,如javascript邏輯分配如何工作?

var a = "one"; 
var b = q || a; 
alert (b); 

邏輯運算符OR將指定的值,以B和警報將是「1」。

這僅限於作業或我們可以在任何地方使用嗎?

它似乎是一個空字符串被視爲未定義相同。這是正確的嗎?

這是如何與AND變量一起工作的?他們的組合呢?

什麼時候使用這些成語或者什麼時候不去的好例子?

+1

參見[JavaScript或(||)變量賦值說明 ](http://stackoverflow.com/questions/2100758/javascript-or-variable-assignment-explanation)和[在Javascript中,當變量聲明中有邏輯運算符時,這意味着什麼? ](http://stackoverflow.com/questions/3088098/in-javascript-what-does-it-mean-when-there-is-a-logical-operator-in-a-variable-d)。 – 2010-12-15 03:40:23

+1

請勿使用它。這是一種愚蠢的語法結構,它不直觀,在閱讀代碼時會減慢很多人的速度。 – 2010-12-15 03:51:25

+5

@MK,不排除一個常見的構造,僅僅因爲那些還沒有認識JavaScript的人不熟悉它。 – 2010-12-15 04:03:15

回答

21

爲了您q || a,以評估aq應該是一個'falsy的價值。你所做的就是所謂的「短路評估」。

回答您的問題:

  1. 邏輯運算符(如和 - &&,或 - ||)可以在其他情況下使用了。更一般地在有條件的語句,如ifMore here

  2. 空串不被視爲undefined。兩者都是虛僞的價值。還有更多的虛假價值。 More here

  3. AND&&在JavaScript中不是變量。這是一個運營商

  4. 你使用的習慣是相當普遍的。

    var x = val || 'default'; //is generally a replacement for

    var x = val ? val : 'default' //or

    if (val) var x = val; else var x = 'default';

6

的方式||工作在JavaScript是:

  1. 如果左操作數的計算結果爲true,返回左操作數
  2. 否則,返回右操作數

& &作品相似。

你可以使用這個在網上存在的檢查,例如:

var foo = (obj && obj.property) 

將設置fooobj.property如果obj定義和「truthy」。

+0

很好解釋! – eddy 2014-08-01 03:14:16

+1

*「如果左操作數的計算結果爲true,則返回左操作數」*否,這是錯誤的。 * Truthy *,不是'true'。 – 2016-12-06 11:41:41

1

此行爲與Perl等其他腳本語言共享。邏輯OR運算符可用作指定默認值的語法簡寫形式,因爲邏輯OR運算符在遇到第一個表達式的值爲true時會停止評估其操作數:「評估第一個操作數以及是否解釋值如果不是false,則分配它,否則重複第二個操作數。「

我發現我經常使用這種行爲來指定函數參數的默認值。例如。

function myFunction(foo, bar) { 
    var fooValue = foo || "a"; 

    // no need to test fooValue -- it's guaranteed to be defined at this point 
} 
+0

如果foo的值爲假(不是「假」),該怎麼辦? – JVM 2017-03-27 20:46:21

+0

這將導致fooValue ==「a」。在布爾上下文中,false,null,undefined,0,NaN和空字符串都計算爲false - 詳情請參閱https://developer.mozilla.org/en-US/docs/Glossary/Falsy – 2017-03-27 22:56:41

+0

正確。然後,在實際需要虛假的地方,這可能會失敗。 – JVM 2017-03-28 01:29:19

1

我不太確定我按照你的問題。您可以在任何可以使用表達式的地方使用表達式,並且兩個表達式上的邏輯運算符會生成表達式。

alert(q||a); 
alert(true||false); 

var x=5; 
var y=0; 
if (y!=0 && x/y>2) { /*do something*/ } 

最後一位很有用。像大多數語言一樣,Javascript'短路'AND和OR。如果AND的第一部分爲假,則它不會評估第二位 - 從而爲您節省0分。如果OR的第一部分是真的,它不會評估第二部分。

但是,您可以在任何可以使用表達式的地方使用布爾運算符。

1

Javascript通過真實/虛假評估邏輯。諸如(false,「」,null,undefined0,-0)的值被評估爲邏輯假。

與懶惰的評價結合這「或者」現在操作都是從left to right計算一次true發現停止。因爲在你的例子中,真值並不是字面上的布爾值,所以返回值。

在這種情況下:

x = 0; y = 5; alert(y || x)/*returns 5*/; alert(x || y)/*also returns 5*/; 

這也可以是其他對象。

functionThatReturnsTrue() || functionThatDoesSomething(); 
0

恕我直言 - 不要用於布爾類型分配。它可能會令人困惑。 As undefined!== false,即false本身就是一個值。

E.g.如果妳想要一個字段值從一個對象複製當且僅當該字段定義

var bar.value = false; 
var foo = true; 

var foo = bar.value || foo; // ==> should be false as bar.value is defined 

對於布爾類型分配,U確實應該使用

var foo = (bar.value !== undefined) ? bar.value : foo;