ES2015
二、函数
1、带参数默认值的函数
在ES5中模拟参数默认值
function makeRequest(url, timeout, callback) {
timeout = timeout || 2000;
callback = callback || function() {};
// 函数的剩余部分
}
//此处的 timeout 的有效值实际上有可能是 0 ,但因为 0 是假值,就会导致 timeout 的值在这种情况下会被替换为 2000 。
//更安全的替代方法是使用 typeof 来检测参数的类型
function makeRequest(url, timeout, callback) {
timeout = (typeof timeout !== "undefined") ? timeout : 2000;
callback = (typeof callback !== "undefined") ? callback : function() {};
// 函数的剩余部分
}
ES6中的参数默认值
function makeRequest(url, timeout = 2000, callback = function() {}) {
// 函数的剩余部分
}
makeRequest("/foo", undefined, function(body) {// 使用默认的 timeout
doSomething(body);
});
makeRequest("/foo");// 使用默认的 timeout
makeRequest("/foo", null, function(body) {// 不使用默认值
doSomething(body);
});
在本例中,只有在未传递第二个参数、或明确将第二个参数值指定为 undefined 时,timeout 的默认值才会被使用。null会被认为是有效参数。
参数默认值如何影响arguments对象
非严格模式:
function mixArgs(first, second) {
console.log(first === arguments[0]); //true
console.log(second === arguments[1]); //true
first = "c";
second = "d";
console.log(first === arguments[0]); //true
console.log(second === arguments[1]); //true
}
mixArgs("a", "b");
严格模式:
function mixArgs(first, second) {
"use strict";
console.log(first === arguments[0]); //true
console.log(second === arguments[1]); //true
first = "c";
second = "d"
console.log(first === arguments[0]); //false
console.log(second === arguments[1]); //false
}
mixArgs("a", "b");
ES6 参数默认值严格模式和非严格模式:
function mixArgs(first, second = "b") {
console.log(arguments.length); //1
console.log(first === arguments[0]); //true
console.log(second === arguments[1]); //false,arguments[1]值为undefined
first = "c";
second = "d"
console.log(first === arguments[0]); //false
console.log(second === arguments[1]); //fasle
}
mixArgs("a");
参数默认值表达式
function getValue(value) {
return value + 5;
}
function add(first, second = getValue(first)) {
return first + second;
}
console.log(add(1, 1)); // 2
console.log(add(1)); // 7
2、剩余参数
剩余参数的限制条件:
函数只能有一个剩余参数,并且它必须被放在最后。
剩余参数不能在对象字面量的 setter 属性中使用。(对象字面量的 setter 被限定只能使用单个参数;而剩余参数按照定义是不限制参数数量的,因此它在此处不被许可。)
function pick(object, ...keys) {
let result = Object.create(null);
for (let i = 0, len = keys.length; i < len; i++) {
result[keys[i]] = object[keys[i]];
}
return result;
}
keys 是一个包含所有在 object 之后的参数的剩余参数(这与包含所有参数的 arguments 不同,后者会连第一个参数都包含在内)。
函数的 length 属性用于指示具名参数的数量,而剩余参数对其毫无影响。此例中pick() 函数的 length 属性值是 1 ,因为只有 object 参数被用于计算该值。