10.2 函数参数
10.2.1 理解参数
ECMAScript的参数内部表现为一个数组,
但函数并不关心数组中包含什么
arguments
arguments是一个类数组对象,
可以在函数内部访问arguments对象,
声明参数写法
1 | function sayHi(name,message) { |
使用arguments重写
1 | function sayHi() { |
使用arguments.length检查传入的参数个数
1 | function doAdd() { |
arguments对象也可以和命名参数一起使用
1 | function doAdd(num1, num2) { |
arguments始终与对应的命名参数同步
但它们并不访问同一个内存地址,
只是保持同步而已。
1 | function doAdd(num1, num2) { |
但如果访问arguments的索引超过了实际传参的数量,则无法同步。
并且访问未传的参数默认值为undefined。
strict mode
- arguments和命名参数无法再同步
- 函数中重写arguments对象会报错
箭头函数中的参数
箭头函数参数不能使用arguments关键字访问
1 | function foo() { |
可以在包装函数中把arguments提供给箭头函数
1 | function foo() { |
10.2.2 没有重载
ECMAScript函数参数内部是由数组表示的,没有函数签名,自然也就无法重载
存在同名函数,后定义的覆盖先定义的
1 | function addSomeNumber(num) { |
可以通过检查参数的类型和数量,分别执行不同逻辑来模拟函数重载。
10.2.3 默认参数值
ECMAScript5.1以前设置默认参数值
简单粗暴 检测参数是否等于undefined,是的话就给它赋一个值
1 | function makeKing(name) { |
ECMAScript6:支持=实现设置参数默认值
1 | function makeKing(name = 'Henry') { |
通过传值为undefined的参数占位
1 | function makeKing(name = 'Henry', numerals = 'VIII') { |
arguments不反映参数的默认值
arguments始终以调用函数时传入的值为准,
所以修改命名参数也不会影响arguments对象
1 | function makeKing(name = 'Henry') { |
默认参数可以是原始类型或者引用类型
计算默认值的函数只有在调用函数并且未传相应参数时才会被调用
1 | let romanNumerals = ['I', 'II', 'III', 'IV', 'V', 'VI']; |
箭头函数得到默认参数
在只有一个参数且设置了默认值的时候,箭头函数参数的括号就不能省略了
1 | let makeKing = (name = 'Henry') => `King ${name}`; |
默认参数作用域与暂时性死区
给参数赋默认值实际上等同于使用let顺序声明
1 | function makeKing(name = 'Henry', numerals = 'VIII') { |
上面这段代码就等同于:
1 | function makeKing() { |
默认参数赋值也是顺序的:
1 | function makeKing(name = 'Henry', numerals = name) { |
暂时性死区
暂时性死区 指的是 前面定义的参数不能引用后面定义的,
否则会抛出错误:
1 | function makeKing(name = numerals, numerals = 'VIII') { |
参数也存在与自己的作用域中
1 | function makeKing(name = 'Henry', numerals = defaultNumers) { |
10.2.4 参数扩展与收集
ES6新增的扩展操作符最有用的场景就是函数定义中的参数列表
使用场景:不需要传入一个数组,强调分别传入数组元素
1 | let values = [1, 2, 3, 4]; |
可以使用扩展操作符拆分可迭代对象参数
1 | console.log(getSum(...values)); //10 |
扩展操作符也可以用于命名参数中
1 | function getProduct(a, b, c = 1) { |
扩展操作符可以把不同长度的独立参数组合为一个数组
1 | function getSum(...values) { |
收集参数前如果还有命名参数,就只会收集剩余的参数
没有剩余的话就只得到空数组
1 | function ignoreFirst(firstValue, ...values) { |
箭头函数支持收集参数
1 | let getSum = (...values) => { |
收集参数不影响arguments
1 | function getSum(...values) { |