《你不知道的Javascript--中卷 學習總結》(語法)

語句和表達式

一、ES7規範有一項"do表達式"提案,相似下面這樣。do{}表達式執行一個代碼塊(包含一個或多個語句),而且返回其中最後一個語句的返回值,而後賦值給變量a。算法

var a,b;
    a = do{
        if(true){
            b = 4 + 32;
        }
    }
    
    a // 42
複製代碼

二、可使用,語句系列逗號運算符將多個獨立的表達式語句串聯成一個語句。(a++,a中第二個表達式a在a++以後執行,結果爲43,並被賦值給b)數組

var a = 42,b;
    b = (a++,a)
    
    a // 43
    b // 43
複製代碼

三、delete運算符能夠刪除對象中的屬性和數組中的單元。(若是操做成功,delete返回true,不然返回false)bash

var obj = {
        a:42
    }
    obj.a // 42
    delete obj.a // true
    obj.a //undefined
複製代碼

四、使用var a = b = 42,不會對變量進行聲明,在嚴格模式中這樣會產生錯誤,或者會無心中建立一個全局變量(b)。函數

五、代碼塊ui

[] + {}  // "[object Object]"

   {} + []  // 0
複製代碼

第一行代碼中,[]被強制類型轉換爲"",而{}會被強制類型轉換爲"[object Object]"spa

第二行代碼中,{}被當作一個獨立的空代碼塊,代碼塊結尾不須要分號,最後+[]將[]顯示強制類型轉換爲0。code

六、事實上Javascript沒有else if,但if和else只包含單條語句的時候能夠省略代碼塊的{}對象

運算符優先級

一、運算符的優先級比=低,用,來鏈接一系列語句的時候,它的優先級最低,其餘操做數的優先級都比它高。ip

var a = 42,b;
    b = (a++,a)
    
    a // 43
    b // 43
    
    
    var a = 42,b;
    b = a++,a;
    a // 43
    b // 42
複製代碼

二、&&運算符的優先級高於=。若是不加括號的話,就會執行做(str && matches)= str.match。這樣會出錯,因爲(str && matches)的結果是一個undefined,所以它不能出如今=運算符的左邊。回調函數

if(str && (matches = str.match(/[aeiou]/g))){
        
    }
複製代碼

三、&&運算符先於||執行,並且執行順序並不是咱們所設想的從左到右。

false && true || true  // true
    (false && true) || true // true
    
    
    true || false && false  // true
    (true || false) && false // false
    true || (false && false) // true
複製代碼

四、&&運算符的優先級高於||,而||的優先級又高於?:

a && b || c ? c || b ? a : c && b : a
    等於
    (a && b || c) ? (c || b) ? a : (c && b) : a
複製代碼

五、?:是右關聯的。

a ? b : c ? d : e
    等於
    a ? b : (c ? d : e)
複製代碼

六、暫時性死區

{
        a = 2; // ReferenceError  變量a初始化以前賦值會拋出錯誤
        let a;
    }
    
    // 對未聲明的變量使用typeof不會產生錯誤
    {
        typeof a;  // undefined
        typeof b; // ReferenceError
        let b;
    }
複製代碼

函數參數

一、在ES6中,若是參數被省略或者值爲undefined,則取該參數的默認值。

function foo(a = 42,b = a+1){
        console.log(a,b)
    }
    foo() // 42 43
    foo(undefined) // 42 43
    foo(5) // 5 6
    foo(void 0,7) // 42 7
    foo(null) // null 1
複製代碼

二、若是向函數傳遞undefined,則arguments數組中會出現一個值爲undefined的單元,而不是默認值。

function foo(a = 42,b = a + 1) {
        console.log(
            arguments.length,a,b,
            arguments[0],arguments[1]
        )
    }
    
    foo() // 0 42 43 undefined undefined
    foo(10) // 1 10 11 10 undefined
    foo(10,undefined) // 2 10 11 10 undefined
    foo(10,null) // 2 10 null 10 null
複製代碼

三、向函數傳遞參數時,arguments數組中的對應單元會和命名參數創建關聯以獲得相同的值,不傳遞不創建關聯(嚴格模式沒有創建關聯)

function foo(a){
        a = 42;
        console.log(arguments[0])
    }
    foo(2) // 42 (linked)
    foo()  // undefined(not linked)
    
    
    function foo(a){
        "use strict"
        a = 42;
        console.log(arguments[0])
    }
    foo(2) // 2 (not linked)
    foo()  // undefined(not linked)
複製代碼

try...finally

一、finally中的代碼老是會在try以後執行,若是有catch的話則在catch以後執行,也能夠將finally中的代碼看做是一個回調函數,最後必定被調用。

function foo() {
        try{
            return 42
        }
        finally {
            console.log('Hello')
        }
        
        console.log('never runs')
    }
    
    console.log(foo())
    // Hello
    // 42
    
    function foo() {
        try{
            throw 42
        }
        finally {
            console.log('Hello')
        }
        
        console.log('never runs')
    }
    
    console.log(foo())
    // Hello
    // Uncaught Exception:42
    
    
    function foo() {
        try{
            return 42
        }
        finally {
            throw "Oops"
        }
        
        console.log('never runs')
    }
    
    console.log(foo())
    // Uncaught Exception:Oops
複製代碼

二、finally中的return會覆蓋try和catch中的return的返回值。

function foo(){
        try{
            return 42;
        }
        finally{
            // 沒有返回語句,因此沒有覆蓋
        }
    }
    
    function bar() {
        try{
            return 42;
        }
        finally{
            return;
        }
    }
    
    function baz() {
        try{
            return 42;
        }
        finally{
            return "Hello";
        }
    }
    
    foo() // 42
    bar() // undefined
    baz() // Hello
複製代碼

switch

一、a和case表達式的匹配算法與===相同。

var a = '42'
    switch(true){
        case a == 10 :
            break;
        case a == 42:
            break;
        default:    
    }
複製代碼

二、儘管可使用==,但switch中true和true之間仍然是嚴格相等比較。即若是case表達式的結果爲真值,但不是嚴格意義上的true,則條件不成立。

var a = 'hello world'
    var b = 10;
    switch(true){
        case (a || b == 10): // 結果爲'hello world' 不會執行這裏
            break; // 永遠執行不到這裏
        default:
            
    }
複製代碼
相關文章
相關標籤/搜索