es5中默认参数写法与es6中默认参数写法
es6之前采用变通方法
function f(x, y, z) {
y=y||7;
z=z||42;
return x + y + z;
}
console.log(f(1)); //50
console.log(f(1,"",0)); //50
存在问题:这种写法缺点 如果y参数有没有赋值,如果没有,则指定默认值7,如果y赋值了 但是对应的布尔值为false,则该赋值不起作用
如果传入为0时 判断时布尔值为false 结果还是50
function f(x, y, z) {
y=y||7;
z=z||42;
return x + y + z;
}
console.log(f(1,0,0)); //50
// es5的写法 { function f(x, y, z) { if (y === undefined) { y = 7; } if (z === undefined) { z = 42; } return x + y + z; } console.log(f(1)); } // es6的写法 { function f1(x, y = 4, z = 12) { return x + y + z; } console.log(f1(1)); }
除了简洁,es6写法还有两个好处 阅读代码的人可以立刻一是到那些参数是可以省略的,不用查看函数体或文档 其次 有利于将来代码优化 及时未来的版本彻底拿到这个参数,也不会导致以前代码无法运行
参数变量是默认声明的 所以不能用let const再次声明
es6中默认参数名称不能重复(不可有重名)
es6中参数的默认值一定要放在参数最后 因为实参和形参是通过顺序一一对应的
与解构赋值默认值结合使用
解构赋值的时候 两边解构形式要完全匹配
function ajax(url,{ body="", method="GET", headers={} }={}){ console.log(method); } ajax("www.baidu.com")
输出 :"GET"
function ajax(url,{ body="", method="GET", headers={} }){ console.log(method); } ajax("www.baidu.com")
输出: 因为没有为对象赋值默认值
函数lenght属性 返回没有指定默认值参数的个数 这是因为length属性的含义是该杉树预期传入的参数个数,默认参数指定默认值以后,预计传入的参数个数就不包括这个参数了,通理 rest参数也不会计入length属性
函数参数生成作用域 一定设置了参数的默认值 函数进行声明初始化时,参数会形成一个单独的作用域(context)等到初始化结束 这个是作用域就会消失
返回昵称名字 anonymous:匿名