1.函数默认参数
在ES6之前函数不能为参数指定默认值,只能采用变通的方法
例如:
function(x,y){
if(!y){
y = "hello"
}
}
ES6里面函数定义:
function(x,y=”hello“){ ...............}
function foo(x=1,y=3){ console.log(x,y) }
foo(undefined,null) //输出 1,null
注意:如果传入undefined将会触发该参数等于默认值,null则触发不了;
指定了默认值以后函数的length属性将返回没有指定默认值的参数个数,例如:foo.length = 0。
2.默认参数的应用
利用默认参数可以指定某大哥参宿不可以省略,如果省略了就跑出错误;
3.函数的reset
参数使用了扩展运算符(...),用于获取函数的多余参数,reset参数后不能再有其他参数,但之前可以有
function(...values)
for(var val of values){
sum += val;
}
}
其中使用了ES6的for ......of.......循环
4.扩展运算符
1)...[2,3,4] = '2,3,4'
求数组最大值 Math.max(...[2,3,4,5])
2)数组合并arr1.concat(arr2) = [...arr1,...arr2]
3)与结构赋值结合
const [fist,...last] = [1,2,3,4,5] //first =1;last = [2,3,4,5]
4)扩展运算符还可以将字符串转换成真正的数组 [...“hello” ] = ['h','e','l','l','o']
5)任何类似数组对象都可以用扩展字符转化为真正的数组[...nodeList] ,ES5里需要用Array.prototype.slice.call(nodeList)
5.name属性
函数的name属性返回函数名
6.箭头函数
v=>v 等价于 function(v){return v}
(x,y)=> x+y 等价于 function(x,y){return x+y}
注意:1)函数体内的this对象就是定义时所在的对象,不是使用时所在对象(可以理解为箭头函数里面没有this指针)
2) 不可以当做构造函数,
3)不可以使用arguments,
4) 不可以适应yield命令,因此箭头函数不能用作Generator函数;
5) 不能使用bind , call , apply方法改变this指向;
例如:function foo(){
setTimeOut( () => {
console.log(this.id)
},1000)
}
foo.call({'id':10) //10
7.函数绑定::
双冒号左边是对象,右边是函数;
8.尾调用优化
function f(x){
return g(x);
}
尾调用是由于函数在调用时会生成一个调用帧,用来保存变量位置等信息;如果函数A的内部调用函数B,那么在A的调用帧的上部就会有B的调用帧。而尾部调用由于是函数的最后一步操作,所以没必要再保留外层函数的调用帧,这大大节省了内存空间。
9.尾递归和柯里化
柯里化意思是将多参数的函数转化成但参数的形式。
尾递归尾调用自身即为尾递归。