参数的默认值
{
function show(x=9,y=0){
console.log([x,y]);
}
show();//[9,0]
show(3);//[3,0]
show(,5);//error
show(3,5);//[3,5]
}
这样写方便了很多,不用像es5那样 x=x || 9那么费劲多写一行代码了
{
function add1(x,y){
var y=y || 5;
console.log(x+y);
}
add1(8);//13
function add2(x,y){
let y=y || 5;
console.log(x+y);
}
add2(8);//报错
}
参数变量是默认声明的,所以不能用let或const再次声明。
默认参数为结构赋值的三种情况
- 1参数默认是等于带有属性和属性值的json
{
function show({x,y}={x:0,y:3}){
console.log([x,y]);
}
show();//[0,3]
show({});//[undefined,undefined]
show({x:8,y:9});//[8,9]
}
这种情况就相当于var {x,y}={x:0,y:3},不传参数就默认等于空的{x:0,y:3},传谁就等于谁
- 2默认参数是等于空的json
{
function show({x=0,y=9}={}){
console.log([x,y]);
}
show();//[0,9]
show({});//[0,9]
show({x:8,y:9});//[8,9]
}
这种情况就相当于var {x=0,y=9}={},不传参数就默认等于空的json,传谁就等于谁
- 3没有等于号后面json的json
function show({x=0,y=9}){
console.log([x,y]);
}
//show();//报错
show({x:8});//[8,9]
show({});//[0,9]
show({x:8,y:9});//[8,9]
其实就是直接show()不传参数,就相当于这种情况,var {x=0,y=9},会直接报错,如果传参的话,就相当于var {x=0,y=9}={};具体就结构赋值情况还请看变量的结构赋值。
参数的默认位置
{
function show(x=9,y){
console.log([x,y]);
]}
//show(,9);//报错
show(9,9);//[9,9]
show(9);//[9,undefined]
}
默认值应该是为参数,如果不是的话,是没有办法省略这个参数的
函数的length属性
{
console.log((function (x,y){}).length);//2
console.log((function (x=2,y){}).length);//0
console.log((function (x,y=3){}).length);//1
}
返回没有指定默认值的参数个数,如果设置了默认值的参数不是尾参数,那么length属性也不再计入后面的参数了。
函数的作用域
{
var b=10;
function show(a,b=a){
console.log(b);//12
}
show(12);
}
一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域
{
let a=12;
function show(a,b=a){
console.log(b);//undefined
}
show();
}
这种情况就是默认定义了a,但是没有赋值,所以是undefined,b=a,所以b是undefined
{
let a=12;
function show(b=a){
let a=10;
console.log(b);//12
}
show();
}
参数b=a形成一个单独的作用域。这个作用域里面,变量a本身没有定义,所以指向外层的全局变量a。函数调用时,函数体内部的局部变量a影响不到默认值变量a。
{
function show(b=a){
let a=10;
console.log(b);//a is not defined
}
show();
}
因为a么有定义,所以会报错a is not undefined
rest参数
{
function show(a,...arr){
console.log(arr);// [3, 4, 5, 6, 7, 8]
}
show(2,3,4,5,6,7,8);
//带有rest参数的函数的length跟带有默认参数的length一样
}
用于获取函数的多余参数,这样就不需要使用arguments对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。
万年不变的国际惯例又来喽,想看更详细的资料请狠狠的点击这里