爲什麼這些邏輯運算符返回一個對象而不是布爾值?爲什麼邏輯運算符(&&和||)總是返回布爾結果?
var _ = (obj.fn && obj.fn()) || obj._ || (obj._ = {});
var _ = obj && obj._;
我想知道爲什麼它會返回obj.fn()
結果(如果它被定義)或obj._
,但不是布爾結果。
爲什麼這些邏輯運算符返回一個對象而不是布爾值?爲什麼邏輯運算符(&&和||)總是返回布爾結果?
var _ = (obj.fn && obj.fn()) || obj._ || (obj._ = {});
var _ = obj && obj._;
我想知道爲什麼它會返回obj.fn()
結果(如果它被定義)或obj._
,但不是布爾結果。
var _ = ((obj.fn && obj.fn()) || obj._ || (obj._ == {/*soemthign*/}))? true: false
將返回布爾值。
UPDATE
請注意,這是基於我的測試。我不能完全信賴。
這是一個表達式,確實是不是分配true
或false
值。相反,它分配計算的值。
讓我們來看看這個表達式。
一個例子表達式:
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._
首先,它必須是真實的回報,所以如果你正在測試的真實性,然後它沒有什麼區別
其次,它可以讓你做線沿線的分配:
function bar(foo) {
foo = foo || "default value";
在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的值不同,因此是正確的。 ]
大家可以參考JS的規範(11.11)在這裏:
語義
生產LogicalANDExpression:LogicalANDExpression & & BitwiseORExpression如下評價:
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爲規範
比較:
var prop;
if (obj.value) {prop=obj.value;}
else prop=0;
有:
var prop=obj.value||0;
返回一個truthy表達 - 而不僅僅是真或假的 - 通常是使你的代碼更短,仍可讀。 ||這是很常見的,對於& &沒有那麼多。
我認爲你在這裏有基本的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'
'!! condition1' is從真實或虛假結果中獲得布爾型「真」或「假」的一種簡單得多的方法。 – Pointy 2016-08-16 15:44:21
簡單的說:
的||
運算符返回第一個真值,如果沒有真值,它返回最後一個值(這是一個虛假值)。
&&
運算符返回第一個falsy值,如果沒有falsy值,則返回最後一個值(它是一個真值)。
其實很簡單。在你的控制檯上進行實驗,看看你自己。
你的答案確實是最容易理解的。謝謝。 – realtebo 2016-11-18 11:49:33
使用Boolean()
功能,如:
var a = 0 || 1;// a = 1
var a = Boolean(0 || 1);// a = true
你可以使用!在得到布爾結果的條件之前。
!!(X && Y) // returns true if both X and Y are not null or undefined
我認爲他想知道爲什麼'一個|| b'不返回布爾值,而是返回'a'或'b'。 – ThiefMaster 2011-03-24 10:52:16
不'var _ = obj && obj ._''返回一個布爾值? O.o /然後它返回什麼?第一個評估爲虛假evt。如果所有的都是真的,最後的結果是真的 – Alxandr 2011-03-24 11:05:32
ThiefMaster,這正是我的意思。我更新了我的帖子 – theateist 2011-03-24 11:05:36