💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] >[success] # 使用不具名参数 ~~~ 在使用'js函数'时,'ES5'可以不写'形参',在函数中用'arguments'数组就可以获取到'实参','ES6'中形参上 需要写一个参数'...keys'的方式,这样写所有传递的'实参'都会成数组的形式。 ~~~ <br/> >[success] ## ES5 和 ES6不具名参数对比 ~~~ let b = [] let c = { d: 2 } function test (){ console.log(arguments) } test('a',b,c) // 等同于 let test = (...keys) => { console.log(keys) } test('a',b,c) 需要'注意'的点,如果函数的形参不止'...keys'一个,并且'...keys'在第一个参数后面,那么'keys' 会把从第二个参数开始后续的所有'实参'生成一个'keys数组',例子如下: function test(a, ...keys) { console.log(keys) } test(1, 2, 3, 4) // [2, 3, 4] ~~~ <br/> >[success] ## ES5 中的不定参数(arguments) ~~~ 'ES5'中可以使用'arguments'参数数组,来获取'所有参数' ~~~ ~~~ function pick(object) { let result = Object.create(null) // 从第二个参数开始处理(数组下标1) for (let i = 1, len = arguments.length; i < len; i++) { result[arguments[i]] = object[arguments[i]] } return result } let book = { title: "Understanding ES6", author: "Nicholas C. Zakas", year: 2015 } let bookData = pick(book, "author", "year") console.log(book) // 原始对象会有__proto__属性 console.log(bookData) // pick方法会返回一个纯净的对象(无__proto__属性) console.log(bookData.author); // "Nicholas C. Zakas" console.log(bookData.year); // 2015 ~~~ <br/> >[success] ## ES6剩余(不定)参数(...keys) ~~~ 下面的'keys'是一个包含所有在'object'之后的参数的'剩余参数'(这与包含所有参数的'arguments'不同, 后者会连第一个参数都包含在内)。这意味着你可以对'keys'从 头到尾进行迭代,而不需要有所顾虑,在 'function'中可以使用'arguments'参数也可以使用'剩余参数' ~~~ ~~~ function pick(object, ...keys) { let result = Object.create(null); for (let i = 0, len = keys.length; i < len; i++) { // 这里i = 0,因为...keys会把object参数后的所有参数作为一个数组 result[keys[i]] = object[keys[i]] } return result; } ~~~ <br/> >[success] ### 剩余参数的限制条件 ~~~ '剩余参数'有'2'点限制条件: 1. 一个函数只能有一个'剩余参数',并且它必须被'放在参数的最后',下面的列子浏览器报错:Uncaught SyntaxError: Rest parameter must be last formal parameter,翻译过来就是未捕获的SyntaxError:'剩余参数'必须是 '最后一个参数' function test(a, ...keys, b) { console.log(a) console.log(keys) console.log(b) } test() 2. '剩余参数'不能在对象的'setter'属性中使用,因为setter属性只允许使用'单个参数' let object = { // 语法错误:不能在 setter 中使用剩余参数 set name(...value) { // 一些操作 } } object.name = [1,2,3,4,5] ~~~