ES6语法:rest&spread基本使用

本文介绍了JavaScript中的展开运算符(...)在数组复制、合并、对象扩展及字符串转字符数组中的应用,并对比了rest参数的使用,展示了其如何替代arguments对象以及提高代码灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、spread(展开)

当在函数调用中使用 ...arr 时,它会把可迭代对象 arr “展开”到参数列表中。

// 展开运算符
...[1,2,3,4,5,6] => 1,2,3,4,5,6

// 最大值
// es5
const values = [10, 20, 3, 9 ]
const max = Math.max.apply(Math, values)
// es6
const values = [10, 20, 3, 9 ]
const max = Math.max(...values)

// 复制
const arr1 = [1,2,3]
const arr2 = arr1  // 改变arr1会改变arr2
// es5
const arr2 = arr1.concat()
// es6
const arr2 = [...arr1]

// 合并数组
// es5
const arr = [1, 2].concat(more)
// es6
const arr = [1, 2, ...more]
const arr1 = ['a', 'b']
const arr2 = ['c']
const arr3 = ['d', 'e']
// es5
arr1.concat(arr2).concat(arr3)
// es6
[...arr1, ...arr2, ...arr3]

// 对象的扩展
// 通过扩展运算符合并对象
const obj1 = {a: 1, b: 2}
const obj2 = {c: 3, d: 5}
const obj = {...obj1, ...obj2}
// 等同于
const obj = Object.assign({}, obj1, obj2)
// 修改对象属性
const person = {
    name: 'bob',
    age: 23,
    sex: 'male'
}
const newPerson = {...person, name: 'lily'}
// {name: 'lily', age: 23, sex: 'male'}

// 将字符串转换为字符数组
let str = "Hello";
alert( [...str] ); // H,e,l,l,o

2、rest不定参数

在 JavaScript 中,无论函数是如何定义的,你都可以使用任意数量的参数调用函数。

// arguments
function pick(object) {
    const result = {}
    for (let i = 1, len = arguments.length; i++) {
        result[arguments[i]] = object[arguments[i]]
    }
    return result
}
const john = {
    name: 'bob',
    age: 23,
    sex: 'male'
}
pick(john, 'name', 'age')

// rest
function pick(object, ...keys) {
    const result = {}
    for (let i = 1, len = keys.length; i++) {
        result[keys[i]] = object[keys[i]]
    }
    return result
}
const john = {
    name: 'bob',
    age: 23,
    sex: 'male'
}
pick(john, 'name', 'age')
  • 不定参数的设计初衷是为了替代arguments对象

  • 不定参数一定要放在所有参数的末尾

// arguments的写法
const sortNumbers = function() {
    return Array.prototype.slice.call(arguments).sort()
}
// 不定参数的写法
const sortNumbers = (...numbers) => numbers.sort()
  • arguments 变量

在过去,JavaScript 中没有 rest 参数,而使用 arguments 是获取函数所有参数的唯一方法。现在它仍然有效,我们可以在一些老代码里找到它。

但缺点是,尽管 arguments 是一个类数组,也是可迭代对象,但它终究不是数组。它不支持数组方法,因此我们不能调用 arguments.map(...) 等方法。

此外,它始终包含所有参数,我们不能像使用 rest 参数那样只截取入参的一部分。

因此,当我们需要这些功能时,最好使用 rest 参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡夫卡的小熊猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值