1、函数参数的默认值
(1)基本用法
ES5 中, 不能直接为函数的参数指定默认值。只能采用变通的方法。
function log(x, y) { y = y || 'World'; console.log(x, y); } log('Hello') // Hello World log('Hello', 'China') // Hello China log('Hello', '') // Hello World (错误)
以上方法虽然可行,但是存在着一定的缺点: 如果参数y 赋了boolean值为false的值,那么该赋值不起作用。
ES6 允许函数参数设置默认值, 即直接写在参数的后面。
function log(x, y = 'World') { console.log(x, y); } log('Hello') // Hello World log('Hello', 'China') // Hello China log('Hello', '') // Hello
除了简洁,ES6 的写法还有两个好处:
1、阅读代码的人, 可以立即看到哪些参数是可以省略的;
2、有利于将来的代码优化; (即使未来的版本在对外接口中,彻底拿掉这个参数,也不会导致以前的代码无法运行。)
变量参数是默认声明的,所以不能用let 或 const 再次声明。
function foo(x = 5) { let x = 1; // error const x = 2; // error }
使用参数默认值时,函数不能有同名参数。
// 不报错 function foo(x, x, y) { // ... } // 报错 function foo(x, x, y = 1) { //有默认值时,不能有同名参数 // ... }
参数默认值是惰性求值的;每次调用都会重新计算表达式的值。
let x = 99; function foo(p = x + 1) { console.log(p); } foo() // 100 x = 100; foo() // 101
(2)与解构赋值默认值结合使用
function foo({x, y = 5}) { console.log(x, y); } foo({}) // undefined 5 foo({x: 1}) // 1 5 foo({x: 1, y: 2}) // 1 2 foo() // TypeError: Cannot read property 'x' of undefined
---恢复内容结束---