咱們用英語的術語來講明它們的區別瀏覽器
「句子」(sentence)是完整表達某個意思的一組詞,由一個或多個「短語」(phrase)組成,它們之間由標點符號或鏈接詞(and 和or 等)鏈接起來。短語能夠由更小的短語組成。有些短語是不完整的,不能獨立表達意思;有些短語則相對完整,而且可以獨立表達某個意思。這些規則就是英語的語法。
JavaScript 的語法也是如此。語句至關於句子,表達式至關於短語,運算符則至關於標點
符號和鏈接詞。函數
語句的結果值
得到結果值最直接的方法是在瀏覽器開發控制檯中輸入語句,默認狀況下控制檯會顯示所執行的最後一條語句的結果值。編碼
操做
設計
這裏var規範規定返回值未undefinedcode
之因此關注表達式,咱們但願能夠將語句當成表達式來處理,從而不須要將語句封裝到函數再用return返回值,咱們怎麼在代碼環境中獲取表達式的返回值呢對象
var b; if (true) { b = 4 + 38; } // 控制檯和REPL中會輸出42
代碼塊的結果就相似隱式返回,可是咱們沒法直接顯式獲取,好比這樣blog
var a, b; a = if (true) { b = 4 + 38; };
咱們能夠用eval(),雖然不是個好方法,可是確實管用ip
var a, b; a = eval( "if (true) { b = 4 + 38; }" ); a; // 42
目前ES7有規範,目前暫未實現開發
var a, b; a = do { if (true) { b = 4 + 38; } }; a; // 42
上下文規則get
1.大括號
// 對象常量 var a = { foo: bar() } // 標籤 在不少語言中goto語法被設計成break 和 continue 結合標籤進行相似goto的操做 { foo: bar() }
2.代碼塊 左邊的{}會被解析爲代碼塊
[] + {}; // "[object Object]" {} + []; // 0
3.對象解構
function getData() { // .. return { a: 42, b: "foo" }; } var { a, b } = getData(); console.log( a, b ); // 42 "foo"
自動分號(ASI)
只在換行符處添加
ASI的陷阱
function foo(a) { return a * 2 + 3 / 12 } // 等同於 function foo(a) { return a * 2; + 3 / 12 } // 解決方案 function foo(a) { return a * 2 + 3 / 12; } function foo(a) { return (a * 2 + 3 / 12); }
return 返回值跨行時,須要用()包起來,或者最後一行加上;
徹底依賴ASI進行編碼,會出現一些意料以外的陷阱
let d let a = { c: 3 } ({c:d} = a)
這裏只爲了解構a中的c,d變量已經被聲明,咱們不能按照常規的解構賦值,{ c:d } = a 能夠將a中的c解構給d,可是這是不合法的語法,{ c:d } 被認爲是代碼塊,= a被認爲是非法的,必須使用()來考慮js引擎這是一個語句,然而這會報錯,由於{}()被認爲是運行前面的對象
處理這些陷阱的辦法,就是依賴ASI編碼時,在() []前面加一個分號來隔斷
let d let a = { c: 3 } ;({c:d} = a)