es6 参数arguments用法

ES5中模拟参数默认值的方式:

function makeRequest(url, timeout, callbak) {
  timeout = timeout || 2000;
  callback = callback || function() {};
  //函数剩余部分

}

本例中,timeout和callback其实都是可选参数。参数未提供时会被替换成默认值。但是这个方式有缺陷,当timeout传进来是0时,会被替换成2000。
所以需要改造

function makeRequest(url, timeout, callback) {
  timeout = (typeof timeout !== 'undefined') ? timeout : 2000;
  callback = (typeof callback !== 'undefined') ? callback : function() {};
  //函数其余部分
}

ES6中参数默认值

functiion makeRequest(url, timeout = 2000, callback = function() {}) {
  //函数剩余部分
}

参数如何影响arguments对象

ES5中在非严格模式中

function foo(num1,num2){
    console.log(num1 === arguments[0]);
    console.log(num2 === arguments[1]);
    num1 = 'a';
    num2 = 'b';
    console.log(num1 === arguments[0]);
    console.log(num2 === arguments[1]);
}
foo(1,2);
//true
//true
//true
//true

这表明在非严格模式下,arguments对象总是会被更新反映出实参的变化。

ES5在严格模式下

'use strict'
function foo(num1,num2){
    console.log(num1 === arguments[0]);
    console.log(num2 === arguments[1]);
    num1 = 'a';
    num2 = 'b';
    console.log(num1 === arguments[0]);
    console.log(num2 === arguments[1]);
}
foo(1,2);
//true
//true
//false
//false

这表明在严格模式下,arguments并没有随着实参的变化而变化。

ES6中有初始值的情况下

function foo(num1,num2=2){
    console.log(arguments.length);
    console.log(num1 === arguments[0]);
    console.log(num2 === arguments[1]);
    num1 = 'a';
    num2 = 'b';
    console.log(num1 === arguments[0]);
    console.log(num2 === arguments[1]);
}
foo(1);
//true
//true
//false
//false
'use strict'
function foo(num1,num2=2){
    console.log(arguments.length);
    console.log(num1 === arguments[0]);
    console.log(num2 === arguments[1]);
    num1 = 'a';
    num2 = 'b';
    console.log(num1 === arguments[0]);
    console.log(num2 === arguments[1]);
}
foo(1);
//true
//true
//false
//false

ES6中arguments不管是在严格模式下还是不在严格模式下都不会随着实参改变。

参数默认值表达式
默认值的不一定要求是基本类型的值。

function getValue() {
  return 5;
}
function add(first, second = getValue()) {
  return first + second;
}
console.log(add(1, 1));   //2
console.log(add(1))   // 6

参数也会有一种暂时性死区的现象

function foo(num1=num2,num2=10){ 
    console.log(num1,num2);
}
foo(1,2)           //1,2
foo(undefined,2)   //报错,ReferenceError,num2不存在

剩余参数(Rest Parameters)

function foo(num1,...num2){ 
    console.log(num2);
}
foo(0,1,2,3,4,5);          //[1,2,3,4,5]

两点注意:
1、剩余参数必须是最后的参数,不然会报错
2、不能用在setter方法中中,因为setter方法只接收单个参数。



作者:zx_lau
链接:https://www.jianshu.com/p/6144cd3d1db8
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值