2011-03-24 41 views
37

爲什麼這些邏輯運算符返回一個對象而不是布爾值?爲什麼邏輯運算符(&&和||)總是返回布爾結果?

var _ = (obj.fn && obj.fn()) || obj._ || (obj._ = {}); 

var _ = obj && obj._; 

我想知道爲什麼它會返回obj.fn()結果(如果它被定義)或obj._,但不是布爾結果。

+7

我認爲他想知道爲什麼'一個|| b'不返回布爾值,而是返回'a'或'b'。 – ThiefMaster 2011-03-24 10:52:16

+1

不'var _ = obj && obj ._''返回一個布爾值? O.o /然後它返回什麼?第一個評估爲虛假evt。如果所有的都是真的,最後的結果是真的 – Alxandr 2011-03-24 11:05:32

+0

ThiefMaster,這正是我的意思。我更新了我的帖子 – theateist 2011-03-24 11:05:36

回答

13
var _ = ((obj.fn && obj.fn()) || obj._ || (obj._ == {/*soemthign*/}))? true: false 

將返回布爾值。

UPDATE

請注意,這是基於我的測試。我不能完全信賴。

這是一個表達式,確實是不是分配truefalse值。相反,它分配計算的值。

讓我們來看看這個表達式。

一個例子表達式:

var a = 1 || 2; 
//a = 1 

//its because a will take the value (which is not null) from left 
var a = 0 || 2; 
//so for this a=2; //its because the closest is 2 (which is not null) 

var a = 0 || 2 || 1; //here also a = 2; 

你的表達:

var _ = (obj.fn && obj.fn()) || obj._ || (obj._ = {}); 

// _ = closest of the expression which is not null 
//in your case it must be (obj.fn && obj.fn()) 
//so you are gettig this 

另一個表達式:

var a = 1 && 2; 
//a = 2 

var a = 1 && 2 && 3; 
//a = 3 //for && operator it will take the fartest value 
//as long as every expression is true 

var a = 0 && 2 && 3; 
//a = 0 

另一個表達式:

var _ = obj && obj._; 

//_ = obj._ 
+0

experimentX,我更新了我的帖子。它返回一個** fn **或** obj ._ **的結果,但不是布爾值。 – theateist 2011-03-24 11:07:04

+2

你也可以使用!! x強制x布爾值 – JoelFan 2014-04-30 19:59:14

+0

如果有人需要:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators – 2018-02-09 20:17:21

1

首先,它必須是真實的回報,所以如果你正在測試的真實性,然後它沒有什麼區別

其次,它可以讓你做線沿線的分配:

function bar(foo) { 
    foo = foo || "default value"; 
54

在JavaScript中,並且& &是邏輯短路運算符,當從左向右評估時返回第一個完全確定的「邏輯值」。

在表達式X || Y中,首先計算X,並將其解釋爲布爾值。 如果此布爾值爲「true」,則返回該值。而Y沒有被評估。 (因爲Y是真還是Y是假,X || Y已經完全確定了。)這就是短路部分。 如果此布爾值爲「false」,那麼我們仍然不知道X || Y是真還是假,直到我們計算Y爲止,並將其解釋爲布爾值。那麼Y就會返回。

AND & &也是這樣,除非停止評估,如果第一個參數爲false。

第一個棘手的部分是,當表達式被評估爲「真」時,表達式本身被返回。在邏輯表達式中它被視爲「真」,但您也可以使用它。所以這就是爲什麼你看到返回的實際值。

第二個棘手的部分是,當表達式評估爲「false」時,則在JS 1.0和1中。1系統將返回一個布爾值「false」;而在JS 1.2中則返回表達式的實際值。

在JS中,null,false,0,「」和undefined都算作false。

[這裏我引用邏輯值是爲了討論。當然,字符串「f a l s e」「false」與false的值不同,因此是正確的。 ]

1

大家可以參考JS的規範(11.11)在這裏:

語義

生產LogicalANDExpression:LogicalANDExpression & & BitwiseORExpression如下評價:

  1. 評估LogicalANDExpression。

2.Call GetValue(Result(1))。

3.Call ToBoolean(Result(2))。

4.如果Result(3)爲false,則返回Result(2)。

5.評估BitwiseORExpression。

6.Call GetValue(Result(5))。

7.返回結果(6)。

看到here爲規範

1

比較:

var prop; 
if (obj.value) {prop=obj.value;} 
else prop=0; 

有:

var prop=obj.value||0; 

返回一個truthy表達 - 而不僅僅是真或假的 - 通常是使你的代碼更短,仍可讀。 ||這是很常見的,對於& &沒有那麼多。

2

我認爲你在這裏有基本的JavaScript Methodology問題。 現在,JavaScript是一種鬆散類型的語言,因此它處理邏輯操作的方式和方式不同於其他標準語言,如Java & C++。 JavaScript使用稱爲「類型強制」的概念來確定邏輯操作的值,並始終返回第一個「true」類型的值。例如,看看下面的代碼:

var x = myshit || document; 
// after execution of the line above, x = document 

這是因爲「myshit」是一個先驗未定義的實體進行測試時將總是爲false 正因爲如此,JavaScript的跳過這一點,並測試下一個實體爲「真正的」價值。由於JavaScript文檔對象是已知的,因此它返回一個真正的值,JavaScript返回這個對象。

如果你想退還給您一個布爾值,你有你的邏輯條件語句傳遞給一個函數,像這樣:

var condition1 = myshit || document; 

function returnBool(cond){ 
    if(typeof(cond) != 'boolean'){ //the condition type will return 'object' in this case 
    return new Boolean(cond).valueOf(); 
    }else{ return; } 
}  
// Then we test... 
var condition2 = returnBool(condition1); 
window.console.log(typeof(condition2)); // outputs 'boolean' 
+0

'!! condition1' is從真實或虛假結果中獲得布爾型「真」或「假」的一種簡單得多的方法。 – Pointy 2016-08-16 15:44:21

35

簡單的說:

||運算符返回第一個真值,如果沒有真值,它返回最後一個值(這是一個虛假值)。

&&運算符返回第一個falsy值,如果沒有falsy值,則返回最後一個值(它是一個真值)。

其實很簡單。在你的控制檯上進行實驗,看看你自己。

+3

你的答案確實是最容易理解的。謝謝。 – realtebo 2016-11-18 11:49:33

0

使用Boolean()功能,如:

var a = 0 || 1;// a = 1 
var a = Boolean(0 || 1);// a = true 
0

你可以使用!在得到布爾結果的條件之前。

!!(X && Y) // returns true if both X and Y are not null or undefined