JS(ES6)实践记录(三)

这篇文章将记录JavaScript ES6下函数相关内容,在ES6中,函数特性大幅度更新,使得JS编程更加灵活。
1.ES6中默认参数
在ES6中,JS简化了为形参提供默认值的过程,如果没有参数传入值则为其提供一个初始值。示例如下:

**function makerequest(url,timeout=2000,callback=functio(){}){
//函数其余部分
}

**
>
其中,url为必须参数,其余两个参数为默认参数.对于函数默认参数而言,个数没有限定。在ES6中,如果一个函数使用了默认参数值,则无论是否显式定义了严格模式,arguments对象行为与ES5严格模式保持一致。默认参数值存在使得arguments对象保持与命名参数分离,默认参数在函数中的变化不会导致arguments对象改变。比如:

**function mixArgs(first,second=”b”){
console.log(arguments.length);//1
console.log(first===arguments[0]);//true
console.log(second===arguments[1]);//false

first="c";
secod="d";
console.log(first===arguments[0]);//false
console.log(second===arguments[1]);//false

}

mixArgs(“a”)
**
>

此例子在ES6中,只给mixArgs传入了一个参数字符串a,因此arguments元素构成的数组只有一个元素字符串a,故其长度为1,且会一直为初始值,不会受函数内部变量变化影响。
对于默认参数表达式而言,函数可以通过非原始传参从而得到默认参数的值,示例如下:

**let value=”5”;

function getvalue(){
return value++;
}
function add(first,second=getvalue()){
return first+second;
}
console.log(add(1,1));//2
console.log(add(1));//6
console.log(add(1));//7
**
>
在此示例中,初次解析函数声明时不会调用getvalue()方法,只有当调用add()方法并传入第二个参数时才会调用。变量value初始值为5,每次调用getvalue()方法时加1.第一次调用add(1),只传入一个参数,没有传入第二个参数,所以执行函数getvalue,使得second默认值变为5,之后代入到函数add()中执行得到6,后面在执行add(1)与之同理。在执行add(1,1)时,直接执行逻辑“1+1”即可返回2.由此观之在没有传入具体参数赋予默认参数时,函数执行过程中任何时候都可以改变其值。
除了上面函数传值外,还有一种是固定参数与默认参数之间传值,比如:

**function getvalue(value){
return value+5;
}

function add(first,second=getvalue(first)){
return first+second;
}
console.log(add(1,1));//2
console.log(add(1));//7
**
>

在这个示例中,声明second=getvalue(first),所以尽管add(1,1)返回是2,但在执行默认参数为变量的函数值时,执行add(1)返回(1+6)即为7.除此外,还要注意。在引用默认参数时,只允许后面的参数引用前面参数的值,即先定义的参数不能访问后面的参数值,否则会抛出错误。
2.ES6中不定参数
在函数命名前加三个点(…)就表明这是一个不定参数,该参数为一个数组,包含着自它之后传入的所有参数,通过这个数组名即可逐一访问里面的参数。代码示例如下:

**function pick(object,…keys){
let result = object.create(null);

for (let i=0,len=keys.length;i<len;i++){
    result[keys[i]] = object[keys[i]];
}
return result;

}

**
>

在这个示例中,不定参数keys包含的是object之后传入的所有参数,除此外需要注意每个函数最多只能声明一个不定参数而且一定要包含在末尾。注意,函数的length属性统计的是函数命名参数数量,不定参数的加入不会影响length属性的值。在本示例中,只会pick()函数length值为1,因为只会计算object。
3.展开运算符