力扣 30 天 JavaScript 挑战 第37天 第九题笔记 知识点: 剩余参数,拓展运算符

开始答题

版本一

js 复制代码
/**
 * @param {...(null|boolean|number|string|Array|Object)} args
 * @return {number}
 */
var argumentsLength = function(...args) {
    return args.length
};

/**
 * argumentsLength(1, 2, 3); // 3
 */

提交通过了 ,我最开始遇到这道题的时候,还想在函数里面如何拿到传递的多个参数,想一想只能是args了,试了一下,成功了。

问了ai为什么会成功,...args是es6写法,通过这个写法将传递的多个参数组合成了一个数组arg。

如果不用这个写法,还可以使用还传统写法:使用内置的 arguments 对象(不是数组,而是一个类数组对象)。如下代码

js 复制代码
function argumentsLength() {
 return arguments.length;
}
argumentsLength(1,2,3)

拓展了类数组,剩余参数(...args)知识点。

最开始看到这个函数的时候,我还有疑问,也没有声明arguments,咋可以使用arguments.length呢。继续问ai。

ai回答:在非箭头函数中,js引擎会在函数执行时,自动注入一个类数组arguments但是arguments不是全局变量,也不是我们声明的。可以理解为

js 复制代码
 function argumentsLength() {
  // 引擎偷偷帮你加上:
  // var arguments = {0: 1, 1: 2, 2: 3, length: 3}
}

这里你可能有些好奇。这里需要注意的一点是arguments虽然说是类数组,但本质上是一个对象。所以不能使用map方法。但可以使用length方法,因为js引擎为我们自动注入arguments的时候给他加了length属性。

开始学习官方题解

剩余参数

  1. 定义:剩余参数(...args)是一种允许函数接受不定数量参数的功能。
  2. 注意点:剩余参数仅收集传递给函数的附加参数,不包括通过命名参数或默认参数值传递的参数。如果没有传递额外参数,剩余参数也将是一个空数组。
js 复制代码
function demo(x, y = 100, ...args) {
  console.log("x:", x);
  console.log("y:", y);
  console.log("args:", args);
}

demo(1, 2, 3, 4, 5);
//输出为
//x: 1
//y: 2
//args: [3, 4, 5]
//这里的命名参数x,y没有通过剩余参数传递。
demo(1);
//输出为
//x: 1
//y: 100
//args: []
//这里的命名参数x,默认参数y没有通过剩余参数传递。并且没有传递额外参数,剩余参数是一个空数组。
  1. 剩余参数于拓展运算符的区别
    剩余参数是打包,拓展运算符是拆开。
特性 剩余参数 ...args 展开运算符 ...arr
出现位置 函数定义的形参 函数调用、数组字面量、对象字面量中
作用方向 收集 → 把多个值打包成数组 展开 → 把数组/可迭代对象拆开成独立元素
返回结果 总是一个数组 展开成一个个元素(不是数组)
例子 function f(...args) {} f(...[1,2,3])

举个例子

js 复制代码
// 剩余参数:收集
function demo(a, b, ...rest) {
  console.log(a);    // 1
  console.log(b);    // 2
  console.log(rest); // [3, 4, 5]
}
demo(1, 2, 3, 4, 5);

// 展开运算符:展开
const nums = [3, 4, 5];
demo(1, 2, ...nums);
// 相当于 demo(1, 2, 3, 4, 5)

官方解法

多了一个通过使用剩余参数

js 复制代码
var argumentsLength = function(...args) {
    return args.length
};
相关推荐
雾岛听蓝1 小时前
Qt开发核心笔记:从HelloWorld到对象树内存管理与坐标体系详解
开发语言·经验分享·笔记·qt
小李子呢02119 小时前
前端八股性能优化(2)---回流(重排)和重绘
前端·javascript
吴声子夜歌11 小时前
Vue3——Vue实例与数据绑定
前端·javascript·vue.js
挖稀泥的工人14 小时前
AI聊天界面的布局细节和打字跟随方法
前端·javascript·面试
竹林81814 小时前
从“连接失败”到丝滑登录:我用 ethers.js 连接 MetaMask 的完整踩坑记录
前端·javascript
颜酱14 小时前
图片大模型实践:可灵(Kling)文生图前后端实现
前端·javascript·人工智能
XiYang-DING14 小时前
【LeetCode】Hash | 136.只出现一次的数字
算法·leetcode·哈希算法
Reart14 小时前
从0解构tinyWeb项目--(Day:2)
javascript·后端·架构
Flittly15 小时前
【SpringAIAlibaba新手村系列】(16)调用百度 MCP 服务
java·笔记·spring·ai·springboot
瑶光守护者15 小时前
【一文读懂】OpenClaw系统架构分析:自主人工智能智能体的范式迁移与技术底座分析
人工智能·笔记·学习·系统架构·边缘计算·openclaw