摘要:中,引入了其他很多語言都具備的模式匹配和默認(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(包括 undefined 和 null)
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.prop 為 undefined 的時候才會執(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
摘要:指北詳談解構(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...
摘要:的正則表達(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...
摘要:數(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ù)組中...
摘要:學(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用于在塊級作...
摘要:主要知識點(diǎn)新增的字符串處理方法模板字面量以及正則表達(dá)式上的改動深入理解筆記目錄字符串字符串是大原始數(shù)據(jù)類型。如果在字符串的結(jié)束部分檢測到指定文本,返回,否則返回。字符串內(nèi)插入反撇號的方式。 主要知識點(diǎn):新增的字符串處理方法、模板字面量以及正則表達(dá)式上的改動showImg(https://segmentfault.com/img/bVbfWak?w=861&h=622); 《深入理解E...
閱讀 1924·2021-11-19 09:40
閱讀 2132·2021-10-09 09:43
閱讀 3294·2021-09-06 15:00
閱讀 2810·2019-08-29 13:04
閱讀 2766·2019-08-26 11:53
閱讀 3512·2019-08-26 11:46
閱讀 2320·2019-08-26 11:38
閱讀 390·2019-08-26 11:27