摘要:為什么比優先級高起因偶然在網上搜索運算符優先級,幾乎每個版本都告訴讀者比優先級更高,包括這樣的權威網站也不例外。這與自己經驗不符它們應該是優先級一樣的。
為什么 && 比 || 優先級高?
起因偶然在網上搜索 js 運算符優先級,幾乎每個版本都告訴讀者 && 比 || 優先級更高,包括 MSN 這樣的權威網站也不例外。
MDN Operator_Precedence
這與自己經驗不符 —— 它們應該是優先級一樣的。
論證0 || 1 && 0 || 2 // 按 && 優先級高 ( 0 || ( 1 && 0 ) ) || 2 // 按優先級一致 0 || ( 1 && ( 0 || 2 ) )
無論怎么執行結果都一樣
詭辯因為有 MDN 背書,中英文版本都是一樣,心想這事情不會那么簡單。于是,打開 ES 規范來找尋真相。
12.13 Binary Logical Operators SyntaxLogicalANDExpression[In, Yield, Await] :
BitwiseORExpression [?In, ?Yield, ?Await]
LogicalANDExpression [?In, ?Yield, ?Await] && BitwiseORExpression [?In, ?Yield, ?Await]
LogicalORExpression[In, Yield, Await]:
LogicalANDExpression [?In, ?Yield, ?Await]
LogicalORExpression [?In, ?Yield, ?Await] || LogicalANDExpression [?In, ?Yield, ?Await]
細細品品以上定義,會發現邏輯或表達式包含邏輯與表達式。再來看看的求值過程:
12.13.3 Runtime Semantics: EvaluationLogicalANDExpression : LogicalANDExpression && BitwiseORExpression
Let lref be the result of evaluating LogicalANDExpression.
Let lval be ? GetValue(lref).
Let lbool be ToBoolean(lval).
If lbool is false, return lval.
Let rref be the result of evaluating BitwiseORExpression.
Return ? GetValue(rref).
LogicalORExpression : LogicalORExpression || LogicalANDExpression
Let lref be the result of evaluating LogicalORExpression.
Let lval be ? GetValue(lref).
Let lbool be ToBoolean(lval).
If lbool is true, return lval.
Let rref be the result of evaluating LogicalANDExpression.
Return ? GetValue(rref).
回看開始的例子里的語句 0 || 1 && 0 || 2
根據定義這是一條邏輯或表達式
執行邏輯等價于 ( 0 || ( 1 && 0 ) ) || 2
這么理解,就符合 && 優先級更高的說法。
總結來個復雜點的
0 || 1 && 0 || 2 && 3 && 0 || 1 && 0
按照規范來執行
( ( 0 || ( 1 && 0 ) ) || ( 2 && 3 && 0 ) ) || ( 1 && 0 )
將兩者理解成不區分優先級,從左到右執行
0 || ( 1 && ( 0 || ( 2 && ( 3 && ( 0 || ( 1 && 0 ) ) ) ) ) )
所以,理論上是 && 優先級更高,但是,使用時可以用等價方式。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/96677.html
摘要:前言為是可以實現的。在中,非對象參數將被視為一個凍結的普通對象,因此會返回。注意所以一定要是對象,如果是非對象的其他基本類型如,,被視為凍結對象,不能重寫,則不起效果。第四步為這時已經為,運行返回值也為。最后為如上所示為,為,則為其他鏈接 前言 a==3 && a==4為True是可以實現的。具體代碼如下所示: let a=[]; var x=3; a.valueOf=()=>{ ...
摘要:以下這個情況并非獨有,任何采用二進制浮點數,依據都會如此這是因為用二進制浮點表示并不精確。是,不過更準確的定義應該是,,因為實際上它還是個。是聲明變量的默認值。數字還有個特殊的數值數字和數字對象 原文 You Dont Know JS: Types & Grammar 類型 null undefined boolean number string object symbol -- a...
摘要:由兩部分組成模板起始符,稱為沉音符反引號,其內容被識別為字符串模板。其實這是通過屬性操作中的結果,也就是說屬性將對控制符進行轉義從而實現按照普通字符輸出。的語法是緊跟在后面,兩者間不能有空格或制表符等。 1. Brief ES6(ECMAScript 6th edition)于2015年7月份發布,雖然各大瀏覽器仍未全面支持ES6,但我們可以在后端通過Node.js 0.12和io....
入坑 Python自從進入公司,到現在也有半年的時間。這半年的時間從 python 到入門到開發了幾個小項目,類型涵蓋了web應用 程序、爬蟲程序 (scrapy),python腳本工具,自動化工具。對 python 語言也越來越熟悉,當然也有所感悟和總結。首先 Python 真的讓語言成 了一個工具,入門代價很小,上手能夠開發出小工具,可以更快體驗到編程的樂趣。但是做到pythonic需要更多的...
閱讀 1820·2021-11-23 09:51
閱讀 927·2021-10-08 10:05
閱讀 3421·2021-09-26 09:55
閱讀 1030·2021-09-22 15:21
閱讀 1626·2021-09-09 09:33
閱讀 1236·2019-08-30 15:56
閱讀 1275·2019-08-30 15:55
閱讀 958·2019-08-30 13:19