擴充套件運算子

2021-09-13 08:35:08 字數 1845 閱讀 3703

使用擴充套件運算子(...)拷貝陣列。

const [a, ...b] = [1, 2, 3];

a // 1

b // [2, 3]

// bad

const len = items.length;

const itemscopy = ;

let i;

for (i = 0; i < len; i++)

// good

const itemscopy = [...items];

(1)結構賦值

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

let = ;

x // 1

y // 2

z //

上面**中,變數 z 是解構賦值所在的物件。它獲取等號右邊的所有尚未讀取的鍵(a和b),將它們連同值一起拷貝過來。

由於解構賦值要求等號右邊是乙個物件,所有如果等號右邊是 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 的屬性。

下面是另乙個例子。

const o = object.create();

o.z = 3;

let } = o;

x // 1

y // undefined

z // 3

上面**中,變數 x 是單純的解構賦值,所以可以讀取物件 o 繼承的屬性;變數 y 和 z 是擴充套件運算子的解構賦值,只能讀取到物件 o 自身的屬性,所以變數 z 可以賦值成功,變數 y 取不到值。

擴充套件運算子

三個點,主要是用來將陣列幻化為用逗號分隔的引數序列。合併陣列 與解構賦值結合 如果將擴充套件運算子用於陣列賦值,只能放在引數的最後一位,否則會報錯。將字串轉為真正的陣列 可以將類似陣列的物件轉為真正的陣列 map和set結構,generator函式 擴充套件運算子內部呼叫的是資料解構的iterato...

擴充套件運算子

首先點明,es6的新特性之擴充套件運算子 spread 就是三個點 和es6的可變引數形式一樣。擴充套件運算子是很強大的乙個運算子,它能簡化很多在es5中會比較繁雜的操作。對於這個運算子,概念性的東西不多,所以這裡我就簡明扼要的給出一些它的常用場景 1 可變引數。雖然可變引數嚴格說不是擴充套件運算子...

擴充套件運算子

擴充套件運算子可以用在函式引數,陣列和物件上 函式裡面成為rest引數 function add values return sum add 2,5,3 10這樣就不需要用arguments引數了。a 1,2,3,4,5 5 1,2,3,4,5 function aaa a undefined aa...