加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

ES6的拓展运算符基础语法和能用于做什么

发布时间:2023-09-20 12:49:43 所属栏目:语言 来源:
导读:关于“ES6的扩展运算符基础语法和能用于做什么”的知识有一些人不是很理解,对此小编给大家总结了相关内容,具有一定的参考借鉴价值,而且易于学习与理解,希望能对大家有所帮助,有这个方面学习需要的朋友

关于“ES6的扩展运算符基础语法和能用于做什么”的知识有一些人不是很理解,对此小编给大家总结了相关内容,具有一定的参考借鉴价值,而且易于学习与理解,希望能对大家有所帮助,有这个方面学习需要的朋友就继续往下看吧。

ES6的扩展运算符,它的语法很简单,使用三个点号表示“...”。可以将一个数组转为用逗号分隔的参数序列。

它将可迭代对象展开到其单独的元素中,所谓的可迭代对象就是任何能用 for of 循环进行遍历的对象,例如:数组、字符串、Map、Set、DOM节点等。

基础语法

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 的所有方法,例如find、map、filter 等,但是可以使用 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

感谢各位的阅读,以上就是“ES6的扩展运算符基础语法和能用于做什么”的内容了,经过本文的学习后,相信大家对ES6的扩展运算符基础语法和能用于做什么都有更深刻的体会了吧。

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章