使用擴充套件運算子(...)拷貝陣列。
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...