解構賦值雖然很方便,但是解析起來並不容易。對於編譯器來說,乙個式子到底是模式,還是表示式,沒有辦法從一開始就知道,必須解析到(或解析不到)等號才能知道。
由此帶來的問題是,如果模式**現圓括號怎麼處理。es6 的規則是,只要有可能導致解構的歧義,就不得使用圓括號。
但是,這條規則實際上不那麼容易辨別,處理起來相當麻煩。因此,建議只要有可能,就不要在模式中放置圓括號。
以下三種解構賦值不得使用圓括號。
(1)變數宣告語句
// 全部報錯
let[
(a)]=[
1];let=;
let()=
;let=;
let=
;let)}
=};
上面 6 個語句都會報錯,因為它們都是變數宣告語句,模式不能使用圓括號。
(2)函式引數函式引數也屬於變數宣告,因此不能帶有圓括號。
// 報錯
functionf(
[(z)])
// 報錯
functionf(
[z,(x)])
(3)賦值語句的模式
// 全部報錯()
=;([a])=
[5];
上面**將整個模式放在圓括號之中,導致報錯。
// 報錯[(
),]=
[,];
上面**將一部分模式放在圓括號之中,導致報錯。
可以使用圓括號的情況只有一種:賦值語句的非模式部分,可以使用圓括號。
[
(b)]=[
3];// 正確(=
);// 正確
[(parseint.prop)]=
[3];
// 正確
上面三行語句都可以正確執行,因為首先它們都是賦值語句,而不是宣告語句;其次它們的圓括號都不屬於模式的一部分。第一行語句中,模式是取陣列的第乙個成員,跟圓括號無關;第二行語句中,模式是p,而不是d;第三行語句與第一行語句的性質一致。
=;
console.
log(t +
'+'+ y)
;//3+5}=
console.
log(t+
'+'+y)
;//3+5
}
物件的解構賦值的內部機制,是先找到同名屬性,然後再賦給對應的變數。真正被賦值的是後者,而不是前者,上面提到的模式部分就是這裡的同名屬性 ES6 解構賦值
陣列的解構賦值 let a,b 12,13 let a,b,c d 13,15,16 let a,b c 78,12 23 let x,y 1,3,5 x 1,y 3 let x,y,z a x a,y undefined z let h,b 1,2,3,4 1,2,3,4 預設值 let x tr...
ES6解構賦值
一 基本用法 解構 destructuring 按照一定的模式,從陣列或者物件中提取值,對變數進行賦值。let par1,par2,par3 1,2 console.log par1,par2,par3 1 2 不完全解構時par3對值為undefined 解構賦值允許指定變數對預設值。let pa...
es6解構賦值
coding changes the world accumulating makes yourself 主要從三個方面講述 陣列式的解構賦值 物件式的解構賦值 函式中的解構賦值 preface 現今的變數宣告語法十分的直接 左邊是乙個變數名,右邊可以是乙個陣列 的表示式或乙個物件 的表示式,等等。...