12 6(解構賦值)

2021-09-02 17:51:35 字數 2342 閱讀 3167

物件的解構賦值用於從乙個物件取值,相當於將目標物件自身的所有可遍歷的(enumerable)、但尚未被讀取的屬性,分配到指定的物件上面。所有的鍵和它們的值,都會拷貝到新物件上面。

let  = ;

x // 1

y // 2

z //

由於解構賦值要求等號右邊是乙個物件,所以

如果等號右邊是undefined或null,就會報錯,因為它們無法轉為物件。

let  = null; // 執行時錯誤

let = undefined; // 執行時錯誤

解構賦值必須是最後乙個引數,否則會報錯。

let  = obj; // 句法錯誤

let = obj; // 句法錯誤

注意,解構賦值的拷貝是淺拷貝,即

如果乙個鍵的值是復合型別的值(陣列、物件、函式)、那麼解構賦值拷貝的是這個值的引用,而不是這個值的副本。

let obj =  };

let = obj;

obj.a.b = 2;

x.a.b // 2

上面**中,x是解構賦值所在的物件,拷貝了物件obj的a屬性。a屬性引用了乙個物件,修改這個物件的值,會影響到解構賦值對它的引用。

擴充套件運算子的解構賦值,不能複製繼承自原型物件的屬性。

let o1 = ;

let o2 = ;

o2.__ proto __ = o1;

let = o2;

o3 //

o3.a // undefined

上面**中,物件o3複製了o2,但是只複製了o2自 身的屬性,沒有複製它的原型物件o1的屬性。

解構賦值的乙個用處,是擴充套件某個函式的引數,引入其他操作。

function basefunction() 

// 使用 x 和 y 引數進行操作

// 其餘引數傳給原始函式

return basefunction(restconfig);

}

物件的擴充套件運算子等同於使用object.assign()方法。

let aclone = ;

// 等同於

let aclone = object.assign({}, a);

上面的例子只是拷貝了物件例項的屬性,如果想完整轉殖乙個物件,還拷貝物件原型的屬性,可以採用下面的寫法。

// 寫法一

const clone1 = ;

// 寫法二

const clone2 = object.assign(

object.create(object.getprototypeof(obj)),

obj);// 寫法三

const clone3 = object.create(

object.getprototypeof(obj),

object.getownpropertydescriptors(obj)

)

擴充套件運算子可以用於合併兩個物件。

let ab = ;

// 等同於

let ab = object.assign({}, a, b);

自定義的屬性,放在擴充套件運算子後面,則擴充套件運算子內部的同名屬性會被覆蓋掉。

let awithoverrides = ;

// 等同於

let awithoverrides = };

// 等同於

let x = 1, y = 2, awithoverrides = ;

// 等同於

let awithoverrides = object.assign({}, a, );

上面**中,a物件的x屬性和y屬性,拷貝到新物件後會被覆蓋掉

擴充套件運算子的引數物件之中,如果有取值函式get,這個函式是會執行的。

// 並不會丟擲錯誤,因為 x 屬性只是被定義,但沒執行

let awithxgetter =

};// 會丟擲錯誤,因為 x 屬性被執行了

let runtimeerror =

}};

解構賦值 陣列的解構賦值

什麼是解構賦值?es6 允許按照一定模式,從陣列和物件中提取值,對變數進行賦值,這被稱為解構 destructuring 我的理解是 允許宣告一種模式 陣列 物件等 裡面包含乙個或多個變數,再分別對這些變數遍歷 按照對應位置 賦值。以前,為變數賦值,只能直接指定值。let a 1 let b 2 通...

Javascript 解構賦值

本文是ecmascript 6 入門學習筆記 es6 允許按照一定模式,從陣列和物件中提取值,對變數進行賦值,這被稱為解構 destructuring 等號的右邊不是陣列必須為可遍歷的結構 具備 iterator 介面 解構賦值為陣列中提取值,按照對應位置,對變數賦值。let x,y 1,2,3 x...

物件解構賦值

先賦值看看 script let console log test1 console log test2 script 簡化寫法 script let console log abc console log def script 在物件解構賦值中,順序是沒有影響的,我們修改上面的內容 script ...