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
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。