1、函数形参的默认值
在ES5中函数定义了参数,如果要设置默认值,则需要在函数内进行判断处理,例如:
要进行判断然后给出相应的默认值
function makeRequest(url, timeout, callback){
timeout = (typeof timeout !== 'undefined')? timeout :2000;
callback = (typeof callback !== 'undefined')? callback :function(){};
}
而在ES6中,可以在函数形参中直接定义默认值,例如:
这样就不用在函数内进行判断给与默认值
function makeRequest(url, timeout = 2000, callback = function(){}){
}
2、默认参数影响arguments
在ES5,非严格模式下,修改参数时,arguments也会跟着变,例如:
function mixArgs(first, second){
console.log(first === arguments[0]); //true
console.log(second === arguments[1]); //true
first = 'c';
second = 'd';
console.log(first === arguments[0]); //true
console.log(second === arguments[1]); //true
}
mixArgs('a', 'b');
在严格模式下,则不同,修改参数,arguments的值也不会变,例如:
function mixArgs(first, second){
"use strict"
console.log(first === arguments[0]); //true
console.log(second === arguments[1]); //true
first = 'c';
second = 'd';
console.log(first === arguments[0]); //false
console.log(second === arguments[1]); //false
}
所以在ES6下面和ES5的严格模式下,arguments的行为是一样的,修改参数值,不会影响arguments的值。
3、处理无命名参数
在函数的命名参数前添加三个点(…)就表明这是一个不定参数,该参数为一个数组,包含着自它之后传入的所有参数,通过这个数组名即可逐一访问里面的参数。例如:
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;
}
需要注意的是:
(1)每个函数最多只能声明一个不定参数,而且一定要放在所有参数的末尾。
(2)不定参数不能用于对象字面量setter之中。
4、展开运算符
展开运算符其实跟不定参数基本相似。Math.max()方法返回两个参数中大的一个,那么怎么返回一个数组中最大的呢。在ES6中,就可以用下面代码:
let values = [25, 50, 70, 100];
console.log(Math.max(...values));
5、箭头函数
箭头函数和传统函数有以下几点不同:
(1)没有this、super、arguments和new.target绑定。
(2)不能通过new关键字调用。
(3)没有原型
(4)不可以改变this的绑定。
(5)不支持arguments对象。
(6)不支持重复的命名参数。
箭头函数一般的写法如下:
let values = [25, 50, 70, 100];
console.log(Math.max(...values));
let sum = (num1, num2) => {
return num1 + num2;
}
创建立即执行函数表达式,例如:
let person = ((name) => {
return {
getName:function(){
return name;
}
}
}
)('Nicholas');
console.log(person.getName()); //Nicholas
6、尾调用优化
尾调用指的是函数作为另一个函数的最后一条语句被调用
在ES5中,尾调用函数会创建一个新的栈帧,推入调用栈,所以在循环调用的时候,相互不能释放,就可能导致调用栈越来越大
在ES6中,缩减了严格模式下的尾调用栈的大小,满足以下条件,尾调用不再创建新的栈帧,而是清除并重用当前栈帧:
(1)尾调用不访问当前栈帧的变量
(2)在函数内部,尾调用是最后一条语句
(3)尾调用的结果作为函数值返回
"use strict"
function doSomething(){
//优化后
return doSomethingElse();
}
function doSomethingElse(){
}
下面的情况不会进行优化:
"use strict"
function doSomething(){
//不优化,因为不作为返回值
doSomethingElse();
}
function doSomethingElse(){
}
"use strict"
function doSomething(){
//不优化,必须在返回值后添加其他操作
return 1 + doSomethingElse();
}
function doSomethingElse(){
}
"use strict"
function doSomething(){
//不优化,因为调用不在尾部
var result = doSomethingElse();
return result;
}
function doSomethingElse(){
}
"use strict"
function doSomething(){
var num = 1,
func = () => num;
//不优化,该函数是个闭包
return func();
}