擴充套件運算子

2021-09-28 23:30:07 字數 2124 閱讀 7611

擴充套件運算子可以用在函式引數,陣列和物件上;

函式裡面成為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 結構賦值 物件的解構賦值用於從...