[英]why does “[] == 0” return true while “[]” is true and “0” is 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
。 我覺得這是奇怪的,因為我希望true
或false
。 誰能解釋一下發生了什么?
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.