ES6对于函数的使用新增了很多实用的API,JS的函数跟很多后台语言PHP,ASP.NET开始看齐:
1. 参数默认值:
以前我们为了给函数创建默认值,必须用一种冗杂的语句,而且有歧义的语句。
//ES5 function myTest(name){ name = name || "default"; console.log(name); } //ES6 function myTest(name = "default"){ console.log(name); }
在ES5中,如果name传入了布尔值false将会产生歧义,而且也不直观,ES6的语法明显简洁很多。
参数默认值通常写在尾部,以便可以省略赋值。
2. reset参数
reset参数是ES6中用于代替arguments对象的一个方法,arguments是类数组,不完全是数组,无法使用sort,slice等方法,而reset是真正的数组:
//ES5 function sortArray(){ var args = Array.prototype.slice.call(arguments); args.sort(); } //ES6 function sortArray(...args){ args.sort(); }
args同样也只能放在末尾
function print(name,city,...others){ var str = name + city; for(var item of others){ str += item; } } print("mic","shenzhen","male","married");
3. name属性
函数具有name属性返回函数名
function myFunc() {} myFunc.name // "myFunc"
4. 箭头函数
箭头函数是ES6中简化函数代码的一个重要特性,可以简化代码
//es5 function myFunc(){ console.log("hello"); } function myFunc(name){ console.log(name); } function add2(num){ return num+2; } function add2(num1,num2){
return num1+num2;
} function myFunc(){ return { res:true, msg:"" } } //es6 ()=>console.log("hello"); name=>console.log(name); num=>num+2;
(num1,num2)=>num1+num2; ()=>({res:true,msg:""})//返回对象需要括号括起来
在forEach场景比较常见,明显简洁很多:
//es5 var list = [1,2,3,4,5,6]; list.forEach(function(num){ return num + 1; }); //es6 let list = [1,2,3,4,5,6]; list.forEach(num=>num+1);
箭头函数有一些特点:
(1) 本身没有this对象,引用this对象是指定义箭头函数的对象
//es5 { addAll:function(pieces) { var self = this; pieces.forEach(function(piece){ self.add(piece); }); }, } //es6 { addAll(pieces){ piece.forEach(piece=>this.add(piece)); } }
有何不同,ES5中forEach函数的this对象默认不是外层函数的this对象,所以需要用一个变量来引用,而箭头函数里面this指的就是定义箭头函数的对象,所以就是当前对象。
(2) 不能作为构造函数
(3) 没有arguments对象,可以用rest替代
(4) 不能作为Generator函数