簡體   English   中英

邏輯 && 和 || JavaScript 中的運算符

[英]The logical && and || operators in JavaScript

我想進一步澄清一些事情。

考慮一下:

var a = 42;
var b = "abc";
var c = null;

a || b;     // 42 
a && b;     // "abc"
c || b;     // "abc" 
c && b;     // null 

我知道對於|| 運算符,如果對第一個操作數的測試為真,則|| 表達式產生第一個操作數(a 或 c)的值。 如果測試為假,則|| 表達式產生第二個操作數 (b) 的值。

相反,對於&&運算符,如果測試為真,則&&表達式會產生第二個操作數 (b) 的值。 如果測試結果為 false, &&表達式將得出第一個操作數(a 或 c)的值

那么當你使用&&||時到底發生了什么具有鏈接值的運算符,例如:

if(a && b && c && d && e){
    //do something;
}

if(a || b || c || d || e){
    //do something
}

當你鏈接價值時到底發生了什么? 因為在第一個示例中(涉及&&運算符)如果 a 為真,那么應該返回 b 對嗎? 那么 c 或 d 甚至在那時被考慮在內嗎?

那么當你使用&&||時到底發生了什么具有鏈接值的運算符

&&是一個二元運算符,有一個左手操作數和一個右手操作數。 表達式a && b && c && d && e基於關聯規則進行解析,使其看起來像這樣:

if (a && (b && (c && (d && e)))) {

根據&&的語義,如果a為假,則整個條件立即計算為a ,這是假的。 如果a為真,則表達式的計算結果為右側,即b && (c && (d && e))) 在這種情況下,如果b為假,那么該子表達式以及整個表達式立即計算為b ,即為假; 如果b為真,則該子表達式計算其右側,即c && (d && e) ,然后過程繼續。

凈結果是直觀的行為,對於整個表達式是falsy,因此對於if分支被采取,就足夠了任何變量是falsy。 一旦遇到任何虛假變量,評估就會“短路”——導致虛假。 要使整個表達式為真,因此要采用if分支,所有變量都必須為真。

對於|| ,邏輯反了。 為了使整個表達式為真,因此要采用if分支,任何變量為真就足夠了。 一旦遇到第一個真值,評估就會“短路”——導致真值。 為了使整個表達式為假,因此采用if分支,所有變量都必須為假。

You Don't Know JS也有很好的解釋。

當你鏈接價值時到底發生了什么?

在第一個表達式 (&&) 中,所有值都必須為真值才能通過條件測試。 假設所有值都是真值,解釋器將評估所有值並且條件測試將通過。 否則它會評估到第一個 falsey 值並且條件測試將失敗。

在第二個表達式 (||) 中,只有一個值必須是真值才能通過條件測試。 假設至少一個值是真值,解釋器將評估到第一個真值並且條件測試將通過。 否則,它將評估所有值,條件測試將失敗。

根據MDN網站文檔:
1-邏輯與(&&)- expr1 && expr2 =>如果expr1可以轉換為true,則返回expr2; 否則,返回expr1。
表示如果expr1為true,則將返回exper2,否則將返回expr1。
2邏輯或(||) -expr1 || expr2 =>如果expr1可以轉換為true,則返回expr1; 否則,返回expr2。
表示如果expr1為true,則輸出將為expr1,否則輸出將為expr2。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM