一、function默认参数

  现在可以在定义函数的时候指定参数的默认值了,而不用像以前那样通过逻辑或操作符来达到目的了。
  es5
function sayHello(name){
//传统的指定默认参数的方式
let name1 = name||'hubwiz';
return 'Hello'+name1;
}
  运用ES6的默认参数
function sayHello2(name='hubwiz'){
return `Hello ${name}`;
}
function sayHello3(name='张三',age=19){
return `大家好,我叫${name},今年${age}岁`+'\n' +"大家好,我叫"+name+",今年"+age;
}
console.log(sayHello());//输出:Hello hubwiz
console.log(sayHello('汇智网')); //输出:Hello 汇智网
console.log(sayHello2()); //输出:Hello hubwiz
console.log(sayHello2('汇智网'));
console.log(sayHello3());//输出:Hello 汇智网
console.log(sayHello3('nick',26));

二、rest参数

  rest参数(形式为“...变量名”)可以称为不定参数,用于获取函数的多余参数,这样就不需要使用arguments对象了。
  rest参数搭配的变量是一个数组,该变量将多余的参数放入数组中。
function add(...values) {
console.log(...values);//1 2 3
console.log(values);//[1,2,3]
let sum = 0;
for (var val of values) {
sum += val;
}
return sum;
}
console.log(add(1, 2, 3));
  不定参数的格式是三个句点后跟代表所有不定参数的变量名。比如以上示例中,...values 代表了所有传入add函数的参数。

三、扩展运算符

  扩展运算符(spread)是三个点(...)。它好比rest参数的逆运算,将一个数组转为用逗号分隔的参数序列。该运算符主要用于函数调用。
  它允许传递数组或者类数组直接做为函数的参数而不用通过apply。
    let people=['张三','李四','王五'];
//sayHello函数本来接收三个单独的参数people1,people2和people3
function sayHello4(people1,people2,people3){
console.log(`Hello ${people1},${people2},${people3}`);
}
//但是我们将一个数组以拓展参数的形式传递,它能很好地映射到每个单独的参数
sayHello4(...people); //输出:Hello 张三,李四,王五
//而在es5,如果需要传递数组当参数,我们需要使用函数的apply方法
sayHello4.apply(null,people); //输出:Hello 张三,李四,王五

四、箭头函数

  箭头函数是使用=>语法的函数简写形式。这在语法上与 C#、Java 8 和 CoffeeScript 的相关特性非常相似
    let array = [1, 2, 3];
//传统写法
array.forEach(function(v) {
console.log(v);
});
//ES6
array.forEach(v => console.log(v));
//它们同时支持表达式体和语句体。与(普通的)函数所不同的是,箭头函数和其上下文中的代码共享同一个具有词法作用域的this。
let evens = [1,2,3,4,5];
let fives = [];
// 表达式体
let odds = evens.map(v => v + 1);
let nums = evens.map((v, i) => v + i);
let pairs = evens.map(v => ({even: v, odd: v + 1})); // 语句体
nums.forEach(v => {
if (v % 5 === 0){
fives.push(v);
}
});
console.log(fives);

  具有词法作用域的 this

    let bob = {
_name: "NICK",
_friends: ["Amy", "Bob", "Cinne", "Dylan", "Ellen"],
printFriends() {
this._friends.forEach(f => console.log(this._name + " knows " + f));
}
}
bob.printFriends();
例子:
  es6
let test = (x, y) => {x++; y--; return x+y};
  相当于es5
function test(x, y) {
x++;
y--;
return x + y;
}

  this问题

class Animal {
constructor(){
this.type = 'animal'
}
says(say){
setTimeout(function(){
console.log(this.type + ' says ' + say)
}, 1000)
}
}
var animal = new Animal()
animal.says('hi') //undefined says hi
  运行上面的代码会报错,这是因为setTimeout中的this指向的是全局对象。所以为了让它能够正确的运行,传统的解决方法有两种:
  第一种是将this传给self,再用self来指代this
function says(say) {
var self = this;
setTimeout(function () {
console.log(self.type + ' says ' + say)
}, 1000)
}

  第二种方法是用bind(this),即

    function says(say){
setTimeout(function(){
console.log(this.type + ' says ' + say)
}.bind(this), 1000)
}

  但现在我们有了箭头函数,就不需要这么麻烦了:

class Animal2 {
constructor(){
this.type = 'animal'
}
says(say){
setTimeout( () => {console.log(this);
console.log(this.type + ' says ' + say)
}, 1000)
}
}
var animal2 = new Animal2();
animal2.says('hi') ; //animal says hi
箭头函数有几个使用注意点。
1.函数体内的this对象,即绑定定义时所在的对象,而不是使用时所在的对象。
  并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,它的this是继承外面的,因此内部的this就是外层代码块的this。
2.不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
3.不可以使用arguments对象,该对象在函数体内不存在。
上面三点中,第一点尤其值得注意。this对象的指向是可变的,但是在箭头函数中,它是固定的。
   此篇终,待续……


最新文章

  1. C#中HttpClient使用注意:预热与长连接
  2. 强大的grep命令
  3. 国内流行的两大开源.net微信公众平台SDK对比分析
  4. IE下使用jquery ajax失效
  5. C#第十一天(winform)
  6. Python爬虫----Beautiful Soup4 基础
  7. sphinx分域搜索
  8. 对于用div+css随心所欲布局的思考
  9. TDD 中关于mock一些理解
  10. python+selenium自动化软件测试(第8章) :多线程
  11. mysql备份并转移数据
  12. 类的继承和C3算法
  13. 第六次spring会议
  14. winetricks 用WineTricks令你的Wine更完整
  15. 【转】Java HotSpot(TM) 64-Bit Server VM warning: Insufficient space for shared memory file:
  16. eclipse的使用和断点调试
  17. sqlite导入mysql
  18. jpql和sql的区别
  19. c3p0-数据库连接池原理
  20. 后缀自动机 && 题目

热门文章

  1. 制作二维码java
  2. 不用循环,、es6创建一个长度为100的数组
  3. Mybatis Mapper动态代理方式 typeAliases 别名的使用
  4. 纯js轮播图练习-3,类似于淘宝海报带小圆点轮播图
  5. Ajax的open()方法
  6. Kafka 学习翻译 - 介绍
  7. 导入/导出excel和PHPExcel基本使用
  8. Hive(9)-自定义函数
  9. Altium Designer常用快捷键
  10. Qt上FFTW組件的编译与安裝