- ?ES5 采用【或操作】实现默认值(存在缺点)
- 改进版:采用??typeof? 判断传入的参数类型,通过三元运算设置默认值
- ES6 直接给参数赋默认值
// ES5 及早期
// 缺点在于 如果 timeout 设置0,也会走【或操作】的 2000
function makeRequest(url, timeout, callback) {
timeout = timeout || 2000;
callback = callback || function () { };
// ...
}
// 改进就是加 typeof 类型判断
function makeRequest(url, timeout, callback) {
timeout = (typeof timeout !== 'underfined') ? timeout : 2000;
callback = (typeof callback !== 'underfined') ? callback : function () { };
// ...
}
// ES6
function makeRequest(url, timeout = 2000, callback = function () { }) {
// ...
}
对于Arguments的影响?
- ES5中,【非严格模式】形参与 arguments 同步更新
- ES5中,【严格模式】?arguments?会保持独立
- ES6,只要用【默认参数】都会按照【严格模式】保持 arguments 独立
// 默认参数值对于 arguments 的影响
// 非严格模式
// 形参的变化会同步到 arguments 中
function mixArg(first, second) {
// "use strict"
// 但在 ES5 的严格模式,arguments会保持独立性
console.log(first === arguments[0]);
console.log(second === arguments[1]);
first = 1;
second = 2;
console.log(first === arguments[0]);
console.log(second === arguments[1]);
}
mixArg("a", "b")
console.log('-'.repeat(20))
// 而在 ES6 的参数默认值后,都会按照【严格模式】arguments 独立
function mixArg_def(first, second = 2) {
console.log("arguments.length", arguments.length)
console.log(first === arguments[0]);
console.log(second === arguments[1]);
first = 1;
second = 2;
console.log(first === arguments[0]);
console.log(second === arguments[1]);
}
mixArg_def("a1")
?参数表达式
- 参数初次解析不会调用默认值表达式中的函数,只有使用函数且未传递参数
- 可用先定义的参数,作为后定义参数的默认值
- 临时死区:虽然解析后会为函数参数分割存储空间,但在初次定义前,将无法访问该存储空间
// 参数表达式
function getDefault() {
return 5;
}
// 注意:如果没有小括号,最终传入函数的引用
function add(num1, num2 = getDefault()) {
return num1 + num2
}
console.log(add(1, 1));
console.log(add(1));
// -------------------------------------------
let value = 5
function getValue() {
return value++;
}
function add(num1, num2 = getValue()) {
return num1 + num2
}
console.log(add(1, 1))
console.log(add(1))
// -----------------------------------------
function add(first, second = first) {
return first + second
}
console.log(add(1, 1))
console.log(add(1))
|