擴充套件運算子可以用在函式引數,陣列和物件上;
函式裡面成為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
aaa(...a)
1 23 4
5//該運算子將乙個陣列,變為引數序列
// es5 的寫法
// es6 的寫法
math.max(...[14, 3, 77])
// 等同於
math.max(14, 3, 77);
注意,rest 引數之後不能再有其他引數(即只能是最後乙個引數)
// 報錯
function f(a, ...b, c)
函式的length
屬性,不包括 rest 引數。
(function(a) {}).length // 1
(function(...a) {}).length // 0
(function(a, ...b) {}).length // 1
arguments
物件不是陣列,而是乙個類似陣列的物件。所以為了使用陣列的方法,必須使用array.prototype.slice.call
先將其轉為陣列。可以for of 遍歷,也可以arguments[i]獲取;但是沒有陣列特有的方法;
rest 引數,它就是乙個真正的陣列,陣列特有的方法都可以使用。
console.log(1, ...[2, 3, 4], 5)
[..., 1]
[1]const a1 = [1, 2];
// 寫法一
const a2 = [...a1];
a1===a2 //false
合併陣列
const arr1 = ['a', 'b'];
const arr2 = ['c'];
const arr3 = ['d', 'e'];
// es5 的合併陣列
arr1.concat(arr2, arr3);
// [ 'a', 'b', 'c', 'd', 'e' ]
// es6 的合併陣列
[...arr1, ...arr2, ...arr3]
// [ 'a', 'b', 'c', 'd', 'e' ]
[...'hello']
// [ "h", "e", "l", "l", "o" ]
與解構賦值結合:
const [first, ...rest] = [1, 2, 3, 4, 5];
first // 1
rest // [2, 3, 4, 5]
let = ;
x // 1
y // 2
z //
擴充套件運算子的解構賦值,不能複製繼承自原型物件的屬性
let o1 = ;
let o2 = ;
o2.__proto__ = o1;
let = o2;
o3 //
o3.a // undefined
但是:const o = object.create();
o.z = 3;
let = o;
let = newobj;
x // 1
y // undefined
z // 3
變數x是單純的解構賦值,所以可以讀取物件o繼承的屬性;
變數y和z是擴充套件運算子的解構賦值,只能讀取物件o自身的屬性,所以變數z可以賦值成功,變數y取不到值。
// // 等同於
// {}
// 等同於
// {}
// 等同於
// {}
擴充套件運算子
三個點,主要是用來將陣列幻化為用逗號分隔的引數序列。合併陣列 與解構賦值結合 如果將擴充套件運算子用於陣列賦值,只能放在引數的最後一位,否則會報錯。將字串轉為真正的陣列 可以將類似陣列的物件轉為真正的陣列 map和set結構,generator函式 擴充套件運算子內部呼叫的是資料解構的iterato...
擴充套件運算子
首先點明,es6的新特性之擴充套件運算子 spread 就是三個點 和es6的可變引數形式一樣。擴充套件運算子是很強大的乙個運算子,它能簡化很多在es5中會比較繁雜的操作。對於這個運算子,概念性的東西不多,所以這裡我就簡明扼要的給出一些它的常用場景 1 可變引數。雖然可變引數嚴格說不是擴充套件運算子...
擴充套件運算子
使用擴充套件運算子 拷貝陣列。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 結構賦值 物件的解構賦值用於從...