1,函数的参数默认值
在ES6中可以直接在形参里面进行默认值赋值:
function makeRequest(url,timeout = 200, callback = function(){}){ ... }
在ES5中我们一般使用:
function makeRequest(url,timeout,callback){ timeout = timeout || 2000; callback = callback || function(){}; }
function makeRequest(url,timeout,callback){
timeout = (typeof timeout !== 'undefined') ? timeout || 2000;
callback = (typeof callback !== 'undefined') ? callback || function(){};
}
在形参未被提供情况下使用默认值。但是如果timeout的值为0,即假值,就会导致timeout被替换为默认值2000;
所以应该更安全的选择typeof来检测参数的类型,很多流行的JS库都是使用上面第二种方法。
那么,参数的默认值如何影响arguments对象?在ES5中
//非严格模式下 function mixAgs(a,b){ console.log(a === arguments[0]); console.log(b === arguments[1]); a = 3,b=4; console.log(a === arguments[0]); console.log(b === arguments[1]); } mixAgs(1,2); // true true true true //严格模式下 function mixAgs(a,b){ "use strict"; console.log(a === arguments[0]); console.log(b === arguments[1]); a = 3,b=4; console.log(a === arguments[0]); console.log(b === arguments[1]); } mixAgs(1,2); // true true false false
function mixAgs(a,b = 5){
console.log(a === arguments[0]);
console.log(b === arguments[1]);
a = 3,b=4;
console.log(a === arguments[0]);
console.log(b === arguments[1]);
}
mixAgs(1,2); //true true false false
可以看出,在非严格模式下,函数的arguments对象可以被更新,严格模式下arguments对象不能被更新。那么ES6的形参默认赋值的函数中,无论是处于严格或是非严格模式,arguments对象都是与ES5的严格模式一致,arguments对象始终能映射出初始调用状态。