ES6对函数的扩展函数蛮多的,不过经常使用的估计也就是默认值和箭头函数了。数组
函数参数默认值:bash
估计不少人都这样用过默认值:函数
var a = 10;
var b = a || 1
复制代码
正常状况下没有问题,可是要是a是0或者是false等会被转换成Boolean类型false的时候就会出错。ES6对参数的默认值容许直接设置:优化
function fn(x = 10, y = 20) {
console.log(x);
console.log(y);
}
fn()// 10 20
复制代码
参数默认值至关于你考虑了没有参数的状况,没有参数也不会报错。要注意的是参数变量不能用let或者const再次声明,不容许同名。参数默认值位置是不能跳过的,想要跳过默认想要传undefined,null无效。还有一点,没有默传参状况下才会赋值:this
function fn(x = (function () {
console.log('执行');
})(), y = 20) {
}
fn()//执行fn(10)
复制代码
参数默认值和解构赋值配合使用:spa
function fn({x = 10, y = 20} = {}) {
console.log(x);
console.log(y);
}
fn()//10 20
fn({x: 30, y: 40})//30 40
复制代码
Length属性:code
简单说就是参数个数:cdn
function fn(a, b, c) {}
console.log(fn.length);//3
复制代码
有默认值的时候,这个length只会计算最后面有默认值以前的参数个数:对象
function fn(a = 0, b, c) {}
console.log(fn.length);//0
function fn(a, b = 0, c) {}
console.log(fn.length);//1
function fn(a, b, c = 0) {}
console.log(fn.length);//2
function fn(a = 0, b = 0, c) {}
console.log(fn.length);//0
复制代码
函数参数做用域:作用域
设置函数参数默认值的时候,参数会造成一个单独的做用域,初始化接收做用域消失。注意,只有设置默认值的时候才会。
var a = 1;function fn(a, b = a) {
console.log(a);
}
fn(10)//10
复制代码
造成一个做用域,b指向了参数里面的a
var a = 1;
function fn(b = a) {
var a = 10;
console.log(b);
}
fn()//1
复制代码
造成做用域,a没有找到就向外寻找,找到全局的a。
Rest参数:
函数有一个arguments参数,咱们能够用数组的方法去获取内容,可是arguments不是数组,用不了数组的方法。Rest参数其实就是用扩展运算符把参数变成一个数组:
function fn(...val) {
console.log(val);
}
fn(1, 2, 3)//[1, 2, 3]
复制代码
严格模式:
ES5以后能够函数内部使用严格模式,ES6只要使用了默认值、解构赋值、或者扩展运算符就不能使用
function fn() {
'use strict'
}
复制代码
Name属性:
ES6对name有一些调整,优先函数名字,其次函数变量的名字,Function构造函数会返回anonymous,经过bind改变this的会加bound
function fn() {}
console.log(fn.name);//fn
var fn = function () {}
console.log(fn.name);//fn
var fn = function ffn() {}
console.log(fn.name);//ffn
console.log((new Function).name);//anonymous
function fn() {}
console.log(fn.bind({}).name);//bound fn
复制代码
箭头函数:
这应该不用多说了,如今几乎都使用箭头函数,以前也有分享过箭头函数的一些内容。
双冒号运算符:
双冒号左边是一个对象,右边是一个函数。该运算符会自动将左边的对象,做为上下文环境(即this对象),绑定到右边的函数上面。这好像目前是一个提案,我试着写了写,运行报错。
尾调用优化:
尾调用是被忽略的,因此单独分享了一篇尾调用优化的,能够查看。
函数参数尾逗号:
咱们函数无论是调用仍是定义的时候,都不会在参数最后面加个逗号,ES2017才开始容许加逗号不报错:
function fn(a, b,) {
console.log(a);
console.log(b);
}
fn(10, 20,)
复制代码
Coding 我的笔记