// 以前
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的值就是false或空的时候,被迫展示成了world。
so:
if (typeof y === 'undefined') {
y = 'World';
}
来个新的:
function log(x, y = 'World') {
console.log(x, y);
}
log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', '') // Hello
此处有个坑位:
function f(x=1,y){return [x,y]}
f(,1) // error
function f(x=1,y=2,z){return [x,y,z]}
f(2,,1) //error
function f(x=1,y=2,z){return [x,y,z]}
f(2,'',1) // [2, "", 1]
所以以上两点是不是很奇怪。。
作用域
区分以下两段代码:
// 代码1
var x = 1;
function f(x, y = x) {
console.log(y);
}
f(2)
// 代码2
let x = 1;
function f(y = x) {
let x = 2;
console.log(y);
}
f()
函数参数的默认值
问题:y的值就是false或空的时候,被迫展示成了world。 so:
来个新的:
此处有个坑位:
所以以上两点是不是很奇怪。。
作用域
区分以下两段代码:
分析可知:代码1中调用时,入参为2,y=x,所以返回2 代码2中,调用时,只有一个全局的x有赋值,所以y就被赋值成全局x的值,在函数执行中,有了x的声明及赋值,但此时y已有值,即1。 如果全局没有声明x,那就会报错了~
死区代码写法:
默认值x的作用域是函数作用域,而不是全局作用域。由于在函数作用域中,存在变量x,但是 默认值在x赋值之前先执行了,所以这时属于暂时性死区(参见《 let 和 const 命令》一章),任何对x的操作都会报错。??
当参数是函数时:
综上:要看这个参数在函数调用时,该函数是否已形成了自己的作用域~~形成了,该参数看参照函数里的变量声明,否则不用考虑。
rest 参数
用于获取函数的多余参数,数组格式。
rest参数之后不能再有其他参数了~只能是最后一个~并且函数的length 也不包括这个参数哦~
扩展运算符
也是三个点 和 rest 有毛关系?