力扣 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
};
相关推荐
爱编程的化学家12 小时前
代码随想录算法训练营第六天 - 哈希表2 || 454.四数相加II / 383.赎金信 / 15.三数之和 / 18.四数之和
数据结构·c++·算法·leetcode·双指针·哈希
BillKu12 小时前
Vue3 + Element-Plus 抽屉关闭按钮居中
前端·javascript·vue.js
DevilSeagull12 小时前
JavaScript WebAPI 指南
java·开发语言·javascript·html·ecmascript·html5
大怪v13 小时前
前端佬:机器学习?我也会啊!😎😎😎手“摸”手教你做个”自动驾驶“~
前端·javascript·机器学习
gnip16 小时前
链式调用和延迟执行
前端·javascript
杨天天.16 小时前
小程序原生实现音频播放器,下一首上一首切换,拖动进度条等功能
前端·javascript·小程序·音视频
Dragon Wu16 小时前
React state在setInterval里未获取最新值的问题
前端·javascript·react.js·前端框架
YU大宗师16 小时前
React面试题
前端·javascript·react.js
lingggggaaaa17 小时前
小迪安全v2023学习笔记(八十一讲)—— 框架安全&ThinkPHP&Laravel&Struts2&SpringBoot&CVE复现
笔记·学习·struts·安全·网络安全·laravel
给月亮点灯|18 小时前
Vue基础知识-Vue集成 Element UI全量引入与按需引入
前端·javascript·vue.js