[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]
~~~
- Javascript基础篇
- Array数组
- 数组插入值
- filter()
- forEach()
- push()
- pop()
- unshift()
- shift()
- valueOf()
- 面向对象思想
- Javascript 面向对象编程(一):封装
- Javascript面向对象编程(二):构造函数的继承
- Javascript面向对象编程(三):非构造函数的继承
- 解构
- 数组的解构赋值
- 对象的解构赋值
- 函数参数解构
- 字符串的解构赋值
- 数值和布尔值的解构赋值
- 圆括号问题
- 字符串.
- split()
- charAt()
- charCodeAt()
- concat()
- indexOf()
- lastIndexOf()
- match()
- replace()
- includes()
- 初识递归
- 渲染ul-li树形结构
- 异步函数解决方案
- 1. callback回调函数
- 2. ES6 - Promise
- JavaScript高级程序设计(书)
- 在html中使用JavaScript
- script标签的位置
- 延迟脚本
- 异步脚本
- <noscript>元素
- 基本概念
- 严格模式
- 变量详解
- 数据类型
- typeof操作符
- undefined类型
- Null类型
- Boolean类型
- Number类型
- 深入了解ES6(书)
- var 、let 、 const
- 字符串与正则表达式
- 字符串
- 正则表达式
- 函数
- 函数形参默认值
- 使用不具名参数
- 函数构造器的增强能力
- 扩展运算符
- name属性
- 明确函数的多重用途
- 块级函数
- 箭头函数
- 尾调用优化
- 扩展的对象功能
- 对象类别
- 对象字面量语法的扩展
- ES6对象新增方法
- 重复的对象属性
- 自有属性的枚举顺序
- 更强大的原型
- 解构:更方便的数据访问
- 为什么要用解构?
- 对象解构
- 数组解构
- 混合解构
- 参数解构
- Symbol与Symbol属性
- 创建Symbol
- Symbol的使用方法
- Symbol全局私有属性
- Symbol与类型强制转换
- Symbol属性检索
- Symbol的一些构造方法
- Set集合与Map集合
- Set集合
- Weak Set集合(弱引用Set集合)
- Map集合
- JS标准内置对象
- Object 构造函数及属性
- Object 构造方法
- Symbol 内建对象类的函数及属性
- Set 构造函数及属性
- Weak Set 构造函数及属性
- JS杂项
- 类数组对象
- Class类的理解和使用