es6函数新特性,在原来es5函数基础上增加了新的函数扩展,包括传参,默认值,扩展运算符...
函数参数
- 函数参数默认值
- 函数参数默认值的执行顺序是随意的
- 只有未传递参数,或者参数为undefined,才是使用默认值
function ajax( url,method='get', timeout=2000,callback={}){}
ajax('/url') // 使用默认的请求方式method、timeout和callback
ajax('/url', 'post') // 使用默认的请求方式timeout和callback
ajax('/url', 'post', null, () => {})
- 函数参数默认值表达式
- 除了使用具体的默认之外,还可以使用表达式构成
- 可以使用之前的参数作为后面参数的默认值
- 函数参数默认值存在在暂存死区,函数表达式中的参数,没有赋值无法作为其他参数的默认值
function getValue() {
return 5
}
function add(a, b=getValue()) {
return a + b
}
function add(a, b=a) {
return a + b
}
剩余参数
es6中,当传递的参数无法确定时,可以使用剩余参数表示,剩余参数是把多个独立的参数合并到一个数组中去,剩余参数表示...args,而 在es5中,多个不确定的参数使用arguments来接收
- 具名参数只能放在剩余参数之前,否则会报错
function rest(a, ...args) {
console.log(a, args) // 1 [2,3,4]
}
rest(1, 2, 3, 4)
可扩展运算符
可扩展运算符能够将具有迭代属性的数据结构,展开分割为独立的元素
- console.log(...[1,2,3])
new target属性
能够使用new target属性来判断函数是否利用new来进行调用的
function target() {
if (new.target !== 'undefined') {console.log('通过new进行创建的')}
}
与解构赋值默认值结合使用
function add ({x, y= 5 } = {}) {
console.log(x + y)
}
add()
* 在参数为对象时,参数的默认值,不仅要对对象进行解构赋值, 而且还要参数对象默认值,避免参数没有传递时报错
箭头函数
箭头函数是es6中更为简洁的书写方式,基本语法:参数 => 函数体
- 箭头函数的新特性
- 没有this,super, arguments和new target的绑定
- 箭头函数中的没有this有外围函数最近的一层非箭头函数决定
- 不能通过new关键字调用
- 箭头函数中没有contruct的方法,也就是构造器属性,因此不能够作为构造函数
- 没有原型对象
- 由于不可以通过new关键字调用构造函数,因为构造函数没有prototype这个属性
- 不可改变this的绑定
- 函数内部的this的值不可以改变,在函数的声明周期内始终保持一致
- 不支持arguments对象
- 箭头函数没arguments绑定只能通过命名函数和不定参数的形式来访问
- 不支持重复命名参数
- 箭头函数不支持重复命名参数
let reflect = value => value
let sum = (sum1, sum2) => num1 + num2
let sum = (sum1, sum2) => {
return num1 + num2
}
[空函数]
let doNothing = () =>{}
[返回对象字面量]
let getObj = (id) => ({id:id, name: name}) // 避免和函数{}混淆
- 在经常使用的回调函数中使用{}形式,相当于使用return(map,filter),如果主函数不具有返回值就直接使用值(forEach)
-
let add = function(a, b) { return a+b } let add = (a, b) => a + b