一起來聊聊ES6中的擴充運算符

WBOY
發布: 2022-08-08 14:47:25
轉載
1602 人瀏覽過

本篇文章為大家帶來了關於javascript的相關知識,其中主要介紹了關於擴展運算符的相關問題,S6的擴展運算符,它的語法很簡單,使用三個點號表示“...”。可以將一個陣列轉為用逗號分隔的參數序列,下面一起來看一下,希望對大家有幫助。

一起來聊聊ES6中的擴充運算符

【相關推薦:javascript影片教學web前端

ES6的擴充運算符,它的語法很簡單,使用三個點號表示“...”。可以將一個陣列轉為用逗號分隔的參數序列。

它將可迭代物件展開到其單獨的元素中,所謂的可迭代物件就是任何能用for of循環進行遍歷的對象,例如:陣列、字串、MapSetDOM節點等。

基礎語法

var array = [1,2,3,4]; console.log(...array);//1 2 3 4 var str = "String"; console.log(...str);//S t r i n g
登入後複製

此運算子主要用於函數呼叫

function push(array, ...items) { array.push(...items); } function add(x, y) { return x + y; } const numbers = [4, 38]; add(...numbers) // 42
登入後複製

在上方程式碼中,array.push(...items)add(...numbers)這兩行,都是函數的調用,它們都使用了擴充運算子。此運算符將一個數組,變成參數序列。

擴充運算子後面還可以放置運算式

const arr = [ ...(x > 0 ? ['a'] : []), 'b', ];
登入後複製

如果擴充運算子後面為空數組,則不會產生任何效果。

[...[], 1] // [1]
登入後複製

擴充運算子還有許多用法...

#一、 替代陣列的apply 方法

使用Math.max() 函數來取得最大值的用法是:

const m = Math.max(1, 2, 3); //结果为3
登入後複製

使用apply 方法結合Math.max():

但如果要計算陣列裡的最大值,顯然陣列是無法直接作為Math.max() 的參數,我們需要將它展開。在ES6之前,我們也是需要結合apply來處理:

var arr = [2, 4, 8, 6, 0]; function max(arr) { return Math.max.apply(null, arr); } console.log(max(arr));
登入後複製

ES6使用擴充運算子(...)就很簡單就可以展開,上面的範例變成:

var arr = [2, 4, 8, 6, 0]; console.log(Math.max(...arr)); // 3
登入後複製

二、擴充運算子的應用

1. 合併陣列

擴充運算子給了我們全新的合併陣列的方法

// ES5 apply 写法 var arr1 = [0, 1, 2]; var arr2 = [3, 4, 5]; Array.prototype.push.apply(arr1, arr2); //arr1 [0, 1, 2, 3, 4, 5]
登入後複製

使用擴充運算子就可以簡單地將陣列展開成參數清單

const a1 = [{ foo: 1 }]; const a2 = [{ bar: 2 }]; const a3 = a1.concat(a2); const a4 = [...a1, ...a2]; a3[0] === a1[0] // true a4[0] === a1[0] // true
登入後複製

上面程式碼中,a3#a4就是使用兩種不同方法合併而成的新數組,但是它們的成員都是對原始數組成員的引用,這就是淺拷貝。如果修改了引用指向的值,則會同步反映到新陣列。

則:這兩種方法都是淺拷貝,使用的時候需要注意。

2. 拷貝數組

數組是複合的資料型,直接複製的話,只是複製了指向底層資料結構的指針,而不是克隆一個全新的陣列。

ES5 只能使用變通法來複製陣列。

const a1 = [1, 2]; const a2 = a1.concat(); a2[0] = 2; a1 // [1, 2]
登入後複製

上面程式碼中,a1會傳回原數組的克隆,再修改a2就不會對a1產生影響。

擴充運算子提供了複製陣列的簡單化方法。

//拷贝数组 var array0 = [1,2,3]; var array1 = [...array0]; console.log(array1);//[1, 2, 3] //拷贝数组 var obj = { age:1, name:"lis", arr:{ a1:[1,2] } } var obj2 = {...obj}; console.log(obj2);//{age: 1, name: "lis", arr: {…}}
登入後複製

則以記住:陣列仍透過指標得到,所以我們並沒有複製陣列本身,我們複製的只是一個新的指標。

3. 將偽數組轉換為陣列

#NodeList物件是節點的集合,通常是由屬性,如Node.childNodes和方法,如document.querySelectorAll回傳的。

像 NodeList 和 arguments 这种伪数组,类似于数组,但不是数组,没有Array的所有方法,例如findmapfilter等,但是可以使用forEach()来迭代

可以通过扩展运算符将其转为数组,如下:

const nodeList = document.querySelectorAll(".row"); const nodeArray = [...nodeList]; console.log(nodeList); console.log(nodeArray);
登入後複製

注意:使用扩展运算符将伪数组转换为数组有局限性,这个类数组必须得有默认的迭代器且伪可遍历的

4.与解构赋值结合

扩展运算符可以与解构赋值结合起来,用于生成数组

// ES5 a = list[0], rest = list.slice(1) // ES6 [a, ...rest] = list
登入後複製

下面是另外一些例子:

const [first, ...rest] = [1, 2, 3, 4, 5]; first // 1 rest // [2, 3, 4, 5] const [first, ...rest] = []; first // undefined rest // [] const [first, ...rest] = ["foo"]; first // "foo" rest // []
登入後複製

注意:如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错。

const [...butLast, last] = [1, 2, 3, 4, 5]; // 报错 const [first, ...middle, last] = [1, 2, 3, 4, 5]; // 报错
登入後複製

5. 字符串

ES6的扩展语法可以很简单的把一个字符串分割为单独字符的数组:

[...'hello'] // [ "h", "e", "l", "l", "o" ]
登入後複製

6.Map 和 Set 结构,Generator 函数

扩展运算符内部调用的是数据结构的 Iterator 接口,因此只要具有 Iterator 接口的对象,都可以使用扩展运算符,比如 Map 结构。

let map = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]); let arr = [...map.keys()]; // [1, 2, 3]
登入後複製

Generator 函数运行后,返回一个遍历器对象,因此也可以使用扩展运算符。

var go = function*(){ yield 1; yield 2; yield 3; }; [...go()] // [1, 2, 3]
登入後複製

上面代码中,变量go是一个 Generator 函数,执行后返回的是一个遍历器对象,对这个遍历器对象执行扩展运算符,就会将内部遍历得到的值,转为一个数组。

如果对没有 Iterator 接口的对象,使用扩展运算符,将会报错。

const obj = {a: 1, b: 2}; let arr = [...obj]; // TypeError: Cannot spread non-iterable object
登入後複製

【相关推荐:javascript视频教程web前端

以上是一起來聊聊ES6中的擴充運算符的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
es6
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!