2017-05-30 32 views
-2

我想知道爲什麼下面兩個表達式返回相同的結果,即當val_bool始終是一個布爾[truefalse]:三元操作和這個選擇有什麼區別?

('oninput' in document.documentElement && !val_bool) && 'first result' || 'second result'; 

('oninput' in document.documentElement && !val_bool) ? 'first result' : 'second result'; 

如果你打開控制檯並運行以下命令:

var val_bool = true; 
('oninput' in document.documentElement && !val_bool) && 'first result' || 'second result'; 

second result輸出。相同的結果被輸出時,我做出改變三元:

var val_bool = true; 
('oninput' in document.documentElement && !val_bool) ? 'first result' : 'second result'; 

我不熟悉與所述第一邏輯表達式解析其結果的機制。

+1

相關閱讀:https://en.wikipedia.org/wiki/Short-circuit_evaluation – apsillers

+1

您是否使用開發控制檯來測試這兩個語句?他們表現不一樣 – zzzzBov

+0

另外,你可能會得到低價,因爲它不完全清楚你不明白的東西。我不認爲這是你的錯*(你不知道你不知道什麼),但它確實使問題難以回答。你是否已經理解布爾邏輯運算符的機制以及短路是如何工作的?你知道JS中的邏輯運算符是如何將它們的操作數作爲「真理」還是「虛假」? – apsillers

回答

1

三元表達式x ? y : z第一部分評估爲布爾值並返回相應的值。

在另一行代碼x && y || z的東西是不同的:它基本上是2倍的表達,而不是1

此鏈接在這裏很有用:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

我們可以看到,&&||已經離開,TO- rigth associativity,這意味着左邊的部分首先被評估。以下行是相等的:

x && y || z 
(x && y) || z 

表達x && y首先計算,並且x && y || z變得result(x,y) || z

實施例時的結果不同而輸入是相同的:

const logical = (x, y, z) => x && y || z; 
 
const ternary = (x, y, z) => x ? y : z; 
 

 
console.log(
 
    logical(1, 0, 1) // 1 && 0 || 1 => 0 || 1 => __ 1 __ 
 
) 
 

 
console.log(
 
    ternary(1, 0, 1) // if (1) then 0; otherwise 1 => __ 0 __ (Boolean(1) === true) 
 
)

+0

非常感謝。我在[邏輯運算符](https:// github。)上找到了這篇文章。COM/getify /你,不要神祕JS/BLOB /主/類型%20%20grammar/ch4.md#運營商 - 和 - )。在*運算符'''和'&&'*下面我發現了這樣一句話:「一個'||'或'&&'表達式的結果總是一個操作數的底層值,而不是(可能被強制的)考試。」我一直認爲評價方式是布爾值,而不是基礎值... –

+0

看過一些例子後,現在它變得更清晰了。將張貼答案只是爲了解決我發佈的實際問題。 –

+0

我很高興能幫到你。 – wostex

0

只是張貼這爲後代。

我在Logical Operators上找到了一篇報價的寶石。根據運營商||和& &,一個段落讀取:

一個||&&表達的結果總是的操作數中的一個 基礎值,不測試的(可能被迫)結果。

事實證明,我從評估的角度看待事物,而不是根本價值。

所以我最初的問題有以下表現:

('oninput' in document.documentElement && !val_bool) && 'first result' || 'second result'; 

讓我們用簡單的變量替換操作數:

var a = true; 
var b = true; 
var c = 'first result'; 
var d = 'second result'; 

(a && !b) && c || d; 

首先,(a && !b)將評估爲false,因爲atrue!bfalsetrue && falsefalse

其次,false結果將與c(false) && c)評估。再次,我們以false結束,因爲c將評估爲字符串(true),並且false && truefalse

最後,false結果將與d評估,只是這一次的操作是||false || true評價是true。然而,這不是評估將返回,而是潛在的價值,這是second result

當然,當我更新的btrue原值false事情會改變。 ||左側的所有內容都會評估爲true,因此當您評估true || true時,您會得到true,但哪個是true是問題。這是||左邊的true,因爲如果我們評估'a' || 'b',結果將是'a'。

所有收費的,它不等同於函數中的三元運算符,但兩個特定表達式[如果變量類型保持不變]的結果應該是相同的。

相關問題