第五章 語法
前言
定義
語法(Grammer)與 句法(Syntax)的在JS中的區別就是語法包括句法,因此本文使用語法一詞。
宣告 & 表示式
許多人認為宣告(statement)與表示式(expressions)是一回事,然而JS中,這兩者之間的區別非常重要。
以英語為例,宣告就是完整句子,表示式是短語,操作符是連詞。貌似 宣告∈表示式∈操作符?
var a = 3 * 6; // var a | a = 3*6 | 3*6 都是表示式? var | = | * 都是連詞?
var b = a;
b; // b 雖然是個表示式,但同時可以是宣告,而這種叫 ”表示式宣告“
獲取宣告完成值
- 在REPL(Read Evaluate Print Loop)中,比如chrome的console,會列印出宣告表示式的完成值
- eval( )
- do { } // ES7
表示式的副作用
- ++a
- delete
- a = b = c
上下文
宣告與表示式在不同的上下文中是不一樣的
各種“{ }”在不同位置表示式的意思也不相同
物件
obj = { foo: bar()}
標籤 + 程式碼塊
foo: { bar(); break foo}
物件解構 ( ES6 )
var {a,b} = {a:1,c:3,b:2}; // a=>1 b=>2
function foo({a,b,c}) {console.log(a,b,c)};
foo({a:1,b:2,c:3});
操作符優先順序(Operator Precedence)
第四章裡已經講過,JS中的 && 與 || 操作符的行為並不是簡單的返回 true 或 false
419 && "turing"; //=> "turing"
419 || "turing"; //=> 419
是不是表現的很奇怪,不過這一章我們不關心返回值,而是關於多個操作符並列使用的優先順序
詳細的介紹請直接查詢 MDN
這裡說一些特性
短路(short circuited)
短路的意思就是當使用 && 或 || 進行判斷時,如果操作符左側表示式的返回值已經能確定結果,那麼右邊的表示式就不會被處理了。
true || 3*6; //=> true
false && 1+2; //=> false
短路的作用
1.防止錯誤丟擲
if (obj && obj.foo) { ...do something }
如果obj未宣告,使用obj.foo會直接丟擲錯誤的
2.減輕工作負擔
if (somevar || foo()) {...}
這裡如果somevar已經存在了,那麼就不用再執行foo了
那麼問題來了,既然有優先順序,我們需要讓JS自動處理,還是用()來把優先順序提升呢?這個問題肯定要讓各路大神撕到起飛。建議就是合理使用,比如 a && b && c;
這種看起來直觀的就沒必要使用(),而像a ? ( b ? c : d ) : e;
這種容易引發歧義的還是用()比較讓人容易理解。
相關文章
- 《Terraform 101 從入門到實踐》 第五章 HCL語法ORM
- 第五章:常用的高階函式和函式的補充語法函式
- 編譯器實現之旅——第五章 實現語法分析器前的準備編譯語法分析
- 英語語法
- JavaScript 新語法 「雙問號語法」與「可選鏈語法」JavaScript
- sql case語法和plsql case語法!SQL
- [一、基本語法]1基本語法概述
- 語法與語義
- Wfurent 語語法概述
- protobuf 語法,proto3 語法參考
- Dart語法篇之基礎語法(一)Dart
- JAVA語法糖和語法糖編譯Java編譯
- dockerfile 語法Docker
- markdown 語法
- 模板語法
- SQL語法SQL
- 語法糖
- Makedown語法
- JavaScript語法JavaScript
- Emmet語法
- jQuery 語法jQuery
- jQuery語法jQuery
- JS語法JS
- Octave語法
- COPY語法
- Explain語法AI
- Progress語法
- smarty語法
- Scala語法
- mark語法
- 語法樹
- XML語法XML
- yaml語法YAML
- 語法點
- Markdown語法
- 德語語法快速學
- 英語語法基礎
- 02 - 03 Dart語法精講-基礎語法Dart