ES6 引入了函数默认值的功能,使得在传入参数时可以设置默认值,简化了函数的代码实现。在 ES9 中,对函数默认值进行了一些增强,使得默认值可以更加方便地应用于函数处理中。
默认值的简单应用
在 ES6 中,通过在函数参数列表中设置默认值就可以轻松地应用默认值。例如下面的代码:
function add(x = 1, y = 2) { return x + y; }
在函数 add
中,如果没有传入参数,那么默认值 x = 1
和 y = 2
将会被使用。因此,调用 add()
函数时的返回值为 3。如果传入了参数,那么默认值将会被覆盖。
默认值的新应用
在 ES9 中,对默认值进行了增强,使得在函数处理中可以更加方便地使用默认值。
默认值的惰性求值
在 ES6 中,函数默认值是在调用时进行计算的。例如:
let x = 1; function foo(y = x++) { console.log(y); } foo(); // 输出 1 foo(); // 输出 2
在调用 foo
函数的第一次调用时,x++
得到了计算,此时 y
的值为默认值 1
,因此第一次调用 foo
函数时输出了 1
。在第二次调用 foo
函数时,x
的值已经变为了 2
,所以 y
的值为 2
,因此第二次调用 foo
函数时输出了 2
。
在 ES9 中,可以通过在函数默认值中定义一个函数,让函数的默认值实现惰性求值的功能。例如:
let x = 1; function foo(y = () => x++) { console.log(y()); } foo(); // 输出 1 foo(); // 输出 1
在上面的代码中,y
的默认值使用了一个箭头函数 () => x++
。在第一次调用 foo
函数时,y
的默认值会被调用,此时箭头函数被执行,输出 1
。在第二次调用 foo
函数时,y
的默认值不会再次被调用,因此输出的结果依然是 1
。
默认值的扩展
在 ES9 中,可以在函数默认值中使用对象和数组的展开语法。例如:
function foo ({x, y, z} = {x: 0, y: 0, z: 0}) { console.log(x, y, z); } foo(); // 输出 0 0 0 foo({x: 1, y: 2, z: 3}); // 输出 1 2 3 foo({x: 1, y: 2}); // 输出 1 2 0
在上面的代码中,函数 foo
的参数使用了对象的展开语法,实现了一个函数默认值为 {x: 0, y: 0, z: 0}
的对象。当没有传入参数时将会使用默认值,即 {x: 0, y: 0, z: 0}
。如果传入参数,则会覆盖默认值中的对应属性值。
另外,还可以在默认值中使用数组的展开语法。例如:
function bar (arr = []) { console.log(arr.length); } bar(); // 输出 0 bar([1, 2, 3]); // 输出 3
在上面的代码中,函数 bar
的参数使用了数组的展开语法,实现了一个空数组的默认值。如果没有传入参数,则会使用空数组作为默认值。
总结
在 ES9 中,增强了函数默认值的功能,使得默认值可以更加方便地应用于函数处理中。通过在默认值中使用惰性求值和对象、数组的展开语法,可以简化函数的代码实现。
示例代码
下面是本文中提到的所有示例代码:
-- -------------------- ---- ------- -- -------- -------- ----- - -- - - -- - ------ - - -- - ------------------- -- -- - -------------------- -- -- - ------------------ ---- -- -- - -- -------- --- - - -- -------- ----- - ---- - --------------- - ------ -- -- - ------ -- -- - --- - - -- -------- ----- - -- -- ---- - ----------------- - ------ -- -- - ------ -- -- - -- --------------- -------- --- ---- -- -- - --- -- -- -- -- --- - -------------- -- --- - ------ -- -- - - - ------- -- -- -- -- ---- -- -- - - - ------- -- -- ---- -- -- - - - -------- --- ---- - --- - ------------------------ - ------ -- -- - ------- -- ---- -- -- -
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646892a6968c7c53b08c0ce7