微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ES6中的rest参数与扩展运算符详解

前言

本文主要给大家介绍了关于ES6中rest参数与扩展运算符的相关内容,rest参数和扩展运算符都是ES6新增的特性。rest参数的形式为:...变量名;扩展运算符是三个点(...)。下面话不多说了,来一起看看详细的介绍:

rest参数

rest参数用于获取函数的多余参数,这样就不需要使用arguments对象了。rest参数搭配的变量是一个数组,该变量将多余的参数放入数组中。

rush:js;"> function add(...values) { let sum = 0; for (var val of values) { sum += val; } return sum; }

add(1,2,3) // 6

传递给 add 函数的一组参数值,被整合成了数组 values。

下面是一个 rest 参数代替arguments变量的例子。

// rest参数的写法
const sortNumbers = (...numbers) => numbers.sort();

rest参数和arguments对象的区别

  • rest参数只包含那些没有对应形参的实参;而 arguments 对象包含了传给函数的所有实参。
  • arguments 对象不是一个真实的数组;而rest参数是真实的 Array 实例,也就是说你能够在它上面直接使用所有的数组方法
  • arguments 对象对象还有一些附加的属性 (比如callee属性)。

另外,使用rest参数时应注意一下两点:

1、rest 参数之后不能再有其他参数(即只能是最后一个参数),否则会报错。

rush:js;"> function f(a,...b,c) { ... } // 报错

2、函数的length属性,不包括 rest 参数。

rush:js;"> (function(a) {}).length // 1 (function(...a) {}).length // 0 (function(a,...b) {}).length // 1

扩展运算符

扩展运算符可以看做是 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列。

rush:js;"> console.log(...[1,3]) // 1 2 3

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

扩展运算符的应用

普通的函数调用

rush:js;"> function push(array,...items) { array.push(...items); }

function add(x,y) {
return x + y;
}

var numbers = [4,38];
add(...numbers) // 42

上面代码中,array.push(...items)add(...numbers)这两行,都是函数调用,它们的都使用了扩展运算符。该运算符将一个数组,变为参数序列。

替代 apply 方法调用函数

rush:js;"> // ES5 的写法 Math.max.apply(null,[14,77])

// ES6 的写法
Math.max(...[14,77])

// 等同于
Math.max(14,77);

rush:js;"> // ES5 的写法 var arr1 = [0,1,2]; var arr2 = [3,4,5]; Array.prototype.push.apply(arr1,arr2);

// ES6 的写法
var arr1 = [0,5];
arr1.push(...arr2);

合并数组

rush:js;"> 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','e' ]

与解构赋值结合

rush:js;"> const [first,...rest] = [1,5]; first // 1 rest // [2,5]

const [first,...rest] = [];
first // undefined
rest // []

const [first,...rest] = ["foo"];
first // "foo"
rest // []

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

rush:js;"> const [...butLast,last] = [1,5]; // 报错

const [first,...middle,5]; // 报错

将字符串转为数组

rush:js;"> var str = 'hello';

// ES5
var arr1 = str.split(''); // [ "h","e","l","o" ]

// ES6
var arr2 = [...str]; // [ "h","o" ]

实现了 Iterator 接口的对象

任何 nofollow" target="_blank" href="http://es6.ruanyifeng.com/#docs/iterator">Iterator 接口的对象,都可以用扩展运算符转为真正的数组。

rush:js;"> var nodeList = document.querySelectorAll('div'); var array = [...nodeList];

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

总结

从上面的例子可以看出,rest参数使用场景应该稍少一些,主要是处理不定数量参数,可以避免arguments对象的使用。而扩展运算符的应用就比较广了,在实际项目中灵活应用,能写出更精简的代码

好了,以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对编程之家的支持

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐