国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ES6 中的模式匹配和默認(rèn)參數(shù)

Loong_T / 1864人閱讀

摘要:中,引入了其他很多語言都具備的模式匹配和默認(rèn)參數(shù)語法糖,使得代碼簡潔了不少。模式匹配中需要注意的觸發(fā)默認(rèn)值如下所示右側(cè)的元素會觸發(fā)左側(cè)的默認(rèn)值。

ES6 中,引入了其他很多語言都具備的模式匹配默認(rèn)參數(shù)語法糖,使得代碼簡潔了不少。但是使用的時候還是有些細(xì)節(jié)需要注意。

模式匹配原理 模式匹配的種類

具體來說,有三種類型的模式匹配:

直接賦值

let a = 1;

對象模式

let {name, age: age} = {name: "yibuyisheng", age: 25};

數(shù)組模式

let [a, b] = [1, 2];

模式匹配的過程

直接賦值:x ← value(包括 undefinednull

x = value

對象模式

該種模式下,會檢查匹配源是不是對象,如果不是對象,則會使用內(nèi)部的 ToObject() 進(jìn)行轉(zhuǎn)換。

{?properties?} ← undefined

throw new TypeError();

- {?properties?} ← null
throw new TypeError();
- {key: ?pattern?, ?properties?} ← obj
?pattern? ← obj.key
{?properties?} ← obj
- {key: ?pattern? = default_value, ?properties?} ← obj
let tmp = obj.key;
if (tmp !== undefined) {
  ?pattern? ← tmp
} else {
  ?pattern? ← default_value
}
{?properties?} ← obj
- {} ← obj
// No properties left, nothing to do

數(shù)組模式

該種模式下,右側(cè)必須是可迭代的,如果不可迭代,就會拋出錯誤。

[?elements?] ← non_iterable

assert(!isIterable(non_iterable))
throw new TypeError();

- [?elements?] ← iterable
assert(isIterable(iterable))
let iterator = iterable[Symbol.iterator]();
?elements? ← iterator
模式匹配中需要注意的 undefined 觸發(fā)默認(rèn)值

如下所示:

let [x = 1] = [undefined]; // x = 1

右側(cè)的 underfined 元素會觸發(fā)左側(cè)的默認(rèn)值。

在需要的時候才會去計算默認(rèn)值

比如:

let {prop: y = someFunc()} = someValue;

只有在右側(cè) someValue.propundefined 的時候才會執(zhí)行 someFunc() 函數(shù)。

模式匹配中可以引用模式中前面的變量

比如:

let [x = 3, y = x] = [7, 2]; // x=7; y=2

這個地方要注意順序,比如下面這個就是錯誤的:

let [x = y, y = 3] = [7, 2]; // ReferenceError
函數(shù)參數(shù)傳遞

函數(shù)傳參的過程,實(shí)際上就包含了模式匹配的過程:

function func(?FORMAL_PARAMETERS?) {
    ?CODE?
}
func(?ACTUAL_PARAMETERS?);

// 大致是:

{
    let [?FORMAL_PARAMETERS?] = [?ACTUAL_PARAMETERS?];
    {
        ?CODE?
    }
}
函數(shù)默認(rèn)參數(shù),慎用對象引用

有如下示例代碼:

let list = [];
function fn(a = list) {
    console.log(a);
}

fn(); // console.log: []
list.push(1);
fn(); // console.log: [1]

默認(rèn)參數(shù)使用了 list 引用,那么后續(xù)對 list 的修改,都會體現(xiàn)到默認(rèn)參數(shù)上面去。在大型項(xiàng)目開發(fā)中,容易失控。如果一定要用某個變量生成默認(rèn)值,建議深拷貝一份:

let list = [];
const listDefaultParam = deepClone(list); // 其它地方不要再使用這個變量了,并且在函數(shù)內(nèi)部也不要修改這個變量值
function fn(a = listDefaultParam) {
    console.log(a);
}
默認(rèn)參數(shù)的作用域

使用最新版的 Chrome 瀏覽器執(zhí)行下面的代碼,注意輸出結(jié)果:

({
    method() {
        function innerFn(a = () => console.log(this)) {
            a();
        }
        innerFn.call(this);
    }
}).method();

({
    method() {
        function innerFn(a = () => console.log(this)) {
            a();
        }
        innerFn();
    }
}).method();

({
    method() {
        let arrowFn = () => console.log(this);
        function innerFn(a = arrowFn) {
            a();
        }
        innerFn();
    }
}).method();

({
    method() {
        let arrowFn = () => console.log(this);
        function innerFn(a = arrowFn) {
            a();
        }
        innerFn.call(this);
    }
}).method();

// output:
//
// Object({method: ()})
// Window { ... }
// Object({method: ()})
// Object({method: ()})

實(shí)際上,將上述代碼用 babel 轉(zhuǎn)換一下,可以發(fā)現(xiàn)默認(rèn)參數(shù)的處理過程發(fā)生在函數(shù)開始部分。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/88077.html

相關(guān)文章

  • ES6指北【6】——詳談解構(gòu)賦值【附贈練習(xí)題】

    摘要:指北詳談解構(gòu)賦值附贈練習(xí)題一何謂解構(gòu)賦值基本概念首先我們看一下給的定義解構(gòu)賦值語法是一個表達(dá)式,這使得可以將值從數(shù)組或?qū)傩詮膶ο筇崛〉讲煌淖兞恐袕亩x中,我們可以發(fā)現(xiàn)解構(gòu)賦值的作用是對變量進(jìn)行賦值主要通過兩個方面實(shí)現(xiàn)這個作用數(shù)組將數(shù)組中的 ES6指北【6】——詳談解構(gòu)賦值【附贈練習(xí)題】 一、何謂解構(gòu)賦值? 1. 基本概念 首先我們看一下MDN給的定義 解構(gòu)賦值語法是一個 Javasc...

    sorra 評論0 收藏0
  • JavaScript正則表達(dá)式RegExp

    摘要:的正則表達(dá)式體系是參照建立的。字面量形式構(gòu)造函數(shù)形式以上都是創(chuàng)建了一個內(nèi)容為的正則表達(dá)式,其表示對一個手機(jī)號碼的校驗(yàn)。按照給定的正則表達(dá)式進(jìn)行替換,返回替換后的字符串。 正則表達(dá)式,也稱規(guī)則表達(dá)式,經(jīng)常使用其來完成對字符串的校驗(yàn)和過濾。由于正則表達(dá)式的靈活性、邏輯性和功能性都非常強(qiáng)大,而且 可以利用很簡單的方式完成對復(fù)雜字符串的控制,所以很多程序語言都支持正則表達(dá)式。在JavaScri...

    SexySix 評論0 收藏0
  • ES6-變量的解構(gòu)賦值(3)

    摘要:數(shù)組的解構(gòu)賦值特點(diǎn)根據(jù)數(shù)據(jù)的下標(biāo)來賦值的,有次序。模式能夠匹配起來,如長度為數(shù)值和布爾值的解構(gòu)賦值解構(gòu)賦值的規(guī)則是只要等號右邊的值不是對象或數(shù)組,就先將其轉(zhuǎn)為對象。布爾值解構(gòu)賦值為字符串的一種。在很多獨(dú)立細(xì)小的方面,解構(gòu)賦值都非常有用。 1、解構(gòu)賦值簡介 官方解釋:按照一定的模式,從數(shù)組和對象中提取值,對變量進(jìn)行賦值,這被稱為解構(gòu)(Destructuring)。 舉個例子,想獲取數(shù)組中...

    Jason_Geng 評論0 收藏0
  • ES6學(xué)習(xí)筆記

    摘要:學(xué)習(xí)筆記在學(xué)習(xí)的過程中做的一些記錄,用于未來的快速回憶。數(shù)組成員為時,默認(rèn)值仍會生效因?yàn)樵趦?nèi)部使用嚴(yán)格相等運(yùn)算符,判斷一個位置是否有值,所以當(dāng)一個數(shù)組成員嚴(yán)格等于默認(rèn)值才會生效。 ES6學(xué)習(xí)筆記 在學(xué)習(xí)ES6的過程中做的一些記錄,用于未來的快速回憶。 let&const 作用域的概念 ES6新增塊級作用域的概念(一個大括號括起來的部分就是一個塊作用域) let與const用于在塊級作...

    mengbo 評論0 收藏0
  • 深入理解ES6筆記(二)字符串正則表達(dá)

    摘要:主要知識點(diǎn)新增的字符串處理方法模板字面量以及正則表達(dá)式上的改動深入理解筆記目錄字符串字符串是大原始數(shù)據(jù)類型。如果在字符串的結(jié)束部分檢測到指定文本,返回,否則返回。字符串內(nèi)插入反撇號的方式。 主要知識點(diǎn):新增的字符串處理方法、模板字面量以及正則表達(dá)式上的改動showImg(https://segmentfault.com/img/bVbfWak?w=861&h=622); 《深入理解E...

    TANKING 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<