第五章 語法

王工發表於2016-04-27

前言

定義

語法(Grammer)與 句法(Syntax)的在JS中的區別就是語法包括句法,因此本文使用語法一詞。

宣告 & 表示式

許多人認為宣告(statement)與表示式(expressions)是一回事,然而JS中,這兩者之間的區別非常重要。

以英語為例,宣告就是完整句子,表示式是短語,操作符是連詞。貌似 宣告∈表示式∈操作符?

var a = 3 * 6; // var a | a = 3*6 | 3*6 都是表示式? var | = | * 都是連詞?
var b = a;
b; // b 雖然是個表示式,但同時可以是宣告,而這種叫 ”表示式宣告“

獲取宣告完成值

  1. 在REPL(Read Evaluate Print Loop)中,比如chrome的console,會列印出宣告表示式的完成值
  2. eval( )
  3. do { } // ES7

表示式的副作用

  1. ++a
  2. delete
  3. a = b = c

上下文

宣告與表示式在不同的上下文中是不一樣的

各種“{ }”在不同位置表示式的意思也不相同

  1. 物件

    obj = { foo: bar()}

  2. 標籤 + 程式碼塊

    foo: { bar(); break foo}

  3. 物件解構 ( 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; 這種容易引發歧義的還是用()比較讓人容易理解。