es6解構賦值圓括號問題

2021-09-22 13:59:42 字數 1411 閱讀 5691

解構賦值雖然很方便,但是解析起來並不容易。對於編譯器來說,乙個式子到底是模式,還是表示式,沒有辦法從一開始就知道,必須解析到(或解析不到)等號才能知道。

由此帶來的問題是,如果模式**現圓括號怎麼處理。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 現今的變數宣告語法十分的直接 左邊是乙個變數名,右邊可以是乙個陣列 的表示式或乙個物件 的表示式,等等。...