簡體   English   中英

為什么Javascript的OR返回的值不是true / false?

[英]Why does Javascript's OR return a value other than true/false?

為了獲得瀏覽器視口寬度,我看到了這種結構:

function () { return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; }

我理解涉及的瀏覽器怪癖。 我不明白的是為什么|| 返回值。 所以我嘗試了這個alert(undefined || 0 || 3); 果然,它提醒3 我覺得這是奇怪的,因為我希望truefalse 誰能解釋一下發生了什么?

JavaScript運算符|| 被定義為如果它評估為真值,則返回左值,否則返回正確的值而不是返回true本身。 這就是它在規范中定義的方式。

我知道它有時會很煩人,你可能會不小心拿到你不想要堅持的東西的引用,但它也允許你的例子有方便的技巧。 一切都有其優點和缺點。

查看ECMAScript標准部分11.11二進制邏輯運算符

生產LogicalORExpression:LogicalORExpression || LogicalANDExpression的評估如下:

1.評估LogicalORExpression。

2.Call GetValue(結果(1))。

3.Call ToBoolean(Result(2))。

4.如果結果(3)為真,則返回結果(2)。

5.評估LogicalANDExpression。

6.Call GetValue(結果(5))。

7.返回結果(6)。

因此它評估每個操作數的布爾轉換,但返回操作數的實際

如果您想知道Javascript如何將值轉換為布爾值,請參見9.2 ToBoolean

不要把它想象成“或”。 它更像是表達式中的流量控制設備。 ||的值 表達式是第一個“truthy”子表達式的值。 因此,對一系列子表達式的評估在某個時刻停止,好像

 expr1 || expr2 || expr3

 (function() {
   var rv = expr1;
   if (rv) return rv;
   rv = expr2;
   if (rv) return rv;
   return expr3;
 })()

OR函數是一個短路OR評估 - 它返回第一個非false的元素,否則返回最后一個false元素。

這實際上非常有用,所以你可以編寫像這樣的表達式

a = a || someValue;

哪個是一樣的

if (a==null)
  a = someValue;

這就是它的設計方式。 || ,就像&&是一個短路運算符,表達式按順序進行計算,它們在表達式滿足條件后停止並產生表達式的結果。 &&也是如此:

var  myObj  = { "Test": { "Foo":"Bar" } };
var  myObj2 = { "Foo": "Bar" };

alert(myObj.Test && myObj.Test.Foo); // will alert "Bar";
alert(myObj2.Test && myObj2.Test.Foo); // will alert undefined;

某些值(例如零, ""undefined )被視為false。 其他任何事都是真的,所以|| operator只返回給定對中的第一個非零(即true)值。 這對於像上面代碼這樣的技巧很有用,但我猜它沒有添加到語言中只是為了讓你跳過奇怪的if語句。

我懷疑它可能起源於性能調整,因為更高級別的語言(例如BASIC ......是的,可能是更高級別的奇怪定義)使用固定常量為true和false - 通常為0和-1,或0和1。

暫無
暫無

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

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