首页 > 作文

es6扩展运算符三个点(…)实例介绍

更新时间:2023-04-03 15:27:14 阅读: 评论:0

1 含义

扩展运算符( spread )是三个点(…)。它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列。

[javascript] view plain copy

console.log(…[1, 2, 3])

// 1 2 3

console.log(1, …[2, 3, 4], 5)

// 1 2 3 4 5

[…document.querylectorall(‘p’)]

// [<p>, <p>, <p>]

该运算符主要用于函数调用。

[javascript] view plain copy

function push(array, …items) {

array.push(…items);

}

function add(x, y) {

return x + y;

}

var numbers = [4, 38];

add(…numbers) // 42

上面代码中,array.push(…items)和ad本科成绩单怎么查d(…numbers)这两行,都是函数的调用,它们的都使用了扩展运算符。该运算符将一个数组,变为参数序列。

扩展运算符与正常的函数参数可以结合使用,非常灵活。

[javascript] view plain copy

function f(v, w, x, y, z) { }

var args = [0, 1];

f(-1, …args, 2, …[3]);

2 替代数组的 apply 方法

由于扩展运算符可以展开数组,所以不再需要apply方法,将数组转为函数的参数了。

[javascript] view plain copy

// es5 的写法

function f(x, y, z) {

// …

}

var args = [0, 1, 2];

f.apply(null, args);

// es6 的写法

function f(x, y, z) {

// …

}

var args = [0, 1, 2];

f(…args);

下面是扩展运算符取代apply方法的一个实际的例子,应用math.max方法,简化求出一个数组最大元素的写法。

[javascript] view plain copy

// es5 的写法

math.max.apply(null, [14, 如何写自我评价3, 77])

// es6 的写法

math.max(…[14, 3, 77])

// 等同于

math.max(14, 3, 77);

上面代码表示,由于 javascript 不提供求数组最大元素的函数,所以只能套用math.max函数,将数组转为一个参数序列,然后求最大值。有了扩展运算符以后,就可以直接用math.max了。

另一个例子是通过push函数,将一个数组添加到另一个数组的尾部。

[javascript] view plain copy

// es5 的写法

var arr1 = [0, 1, 2];

var arr2 = [3, 4, 5];

array.prototype.push.apply(arr1, arr2);

// es6 的写法

var arr1 = [0, 1, 2];

var arr2 = [3, 4, 5];

arr1.push(…arr2);

上面代码的 es5 写法中,push方法的参数不能是数组,所以只好通过apply方法变通使用push方法。有了扩展运算符,就可以直接将数组传入push方法。

下面是另外一个例子。

[javascript] view plain copy

// es5

new (date.bind.apply(date, [null, 2015, 1, 1]))

// es6

new date(…[2015, 1, 1]);

3 扩展运算符的应用

( 1 )合并数组

扩展运算符提供了数组合并的新写法。

[javascript] view plain copy

// es5

[1, 2].concat(more)

// es6

[1, 2, …more]

var arr1 = [‘a’, ‘b’];

var arr2 = [‘c’];

var arr3 = [‘d’, ‘e’];

// es5 的合并数组

arr1.concat(arr2, arr3);

// [ ‘a’, ‘b’, ‘c’, ‘d’, ‘e’ ]

// es6 的合并数组

[…arr1, …arr2, …arr3]

// [ ‘a’, ‘b’, ‘c’, ‘d’, ‘e’ ]

( 2 )与解构赋值结合

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

[javascript] view plain copy

// 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 // []

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

[javascript] view plain copy

const […butlast, last] = [1, 2, 3, 4, 5];

// 报错

const [first, …middle, last] = [1, 2, 3, 4, 5];

// 报错

( 3 )函数的返回值

javascript 的函数只能返回一个值,如果需要返回多个值,只能返回数组或对象。扩展运算符提供了解决这个问题的一种变通方法。

[javascript] view plain copy

var datefields = readdatefields(databa);

var d = new date(…datefields);

上面代码从取出一行数据,通过扩展运算符,直接将其传入构造函数date。

( 4 )字符串

扩展运算符还可以将字符串转为真正的数组。

[javascript] view 顶点式二次函数表达式plain copy

[…’hello’]

// [ “h”, “e”, “l”, “l”, “o” ]

上面的写法,有一个重要的好处,那就是能够正确识别 32 位的 unicode 字符。

[javascript] view plain copy

‘x\ud83d\ude80y’.length // 4

[…’x\ud83d\ude80y’].length // 3

上面代码的第一种写法, javascript 会将 32 位 unicode 字符,识别为 2 个字符,采用扩展运算符就没有这个问题。因此,正确返回字符串长度的函数,可以像下面这样写。

[javascript] view plain copy

function length(str) {

return […str].length;

}

length(‘x\ud83d\ude80y’) // 3

凡是涉及到操作 32 位 unicode 字符的函数,都有这个问题。因此,最好都用扩展运算符改写。

[javascript] view plain copy

let str = ‘x\ud83d\ude80y’;

str.split(”).rever().join(”)

// ‘y\ude80\ud83dx’

[…str].rever().join(”)

// ‘y\ud83d\ude80x’

上面代码中,如果不用扩展运算符,字符串的rever操作就不正确。

( 5 )实现了 iterator 接口的对象

任何 iterator 接口的对象,都可以用扩展运算符转为真正的数组。

[javascript] view plain copy

var nodelist = document.querylectorall(‘p’);

var array = […nodelist];

上面代码中,querylectorall方法返回的是一个nodelist对象。它不是数组,而是一个类似数组的对象。这时,扩展运算符可以将其转为真正的数组,原因就在于nodelist对象实现了 iterator 接口。

对于那些没有部署 iterator 接口的类似数组的对象,扩展运算符就无法将其转为真正的数组。

[javascript] view plain copy

let arraylike = {

‘0’: ‘a’,

‘1’: ‘b’,

‘2’: ‘c’,

length: 3

};

// typeerror: cannot spread non-iterable object.

let arr = […arraylike];

上面代码中,arraylike是一个类似数组的对象,但是没有部署 iterator 接口,扩展运算符就会报错。这时,可以改为使用array.from方法将arraylike转为真正的数组。

(寒鸦戏水 6 ) map 和 t 结构, generator 函数

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

[javascript] view plain co杜牧的诗有哪些py

let map = new map([

[1, ‘one’],

[2, ‘two’],

[3, ‘three’],

]);

let arr = […map.keys()]; // [1, 2, 3]

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

[javascript] view plain copy

var go = function*(){

yield 1;

yield 2;

yield 3;

};

[…go()] // [1, 2, 3]

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

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

[javascript] view plain copy

var obj = {a: 1, b: 2};

let arr = […obj]; // typeerror: cannot spread non-iterable object

本文发布于:2023-04-03 15:27:13,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/cc609bb93634ab1ae5ac7f4d3bfd3b3e.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:es6扩展运算符三个点(…)实例介绍.doc

本文 PDF 下载地址:es6扩展运算符三个点(…)实例介绍.pdf

标签:数组   运算符   函数   写法
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图