ES6

目前不使用Es7的主要原因是大量浏览器仅支持ES 6或者ES5版本。

1、为什么要使用Es6 ,是一次重大的版本升级,它秉承着最大化兼容已有代码的设计理念。过去编写的JS代码还能正常运行。。可以更加方便的实现很多复杂的操作,提高开发人员的效率

ES6排名前十位的最佳特性列表

  • Default Parametes (默认参数)
  • Template Literals (模板文本)
  • Multi-line Strings(多行字符串)
  • Destructuring Assignment (解构赋值)
  • Enhanced Object Literals (增强的对象文本)
  • Arrow Functions (箭头函数)
  • Promises in ES 6
  • Block-Scoped Constructs Let and Const (块作用域构造)
  • Classes(类)
  • Modules(模块)

2.简单用法:

1、可以把默认值放在函数声明里
var link = function(height = 50, color = 'red', url='http://baidu.com'){
.....
}
2、

    ES6之前方式只能使用组合字符串方法
     var name = 'Your name is' + first + ' '+ last + ' . ';
     ES6中,可以使用新的语法 ${name} ,并将其放在反引号里;
    var name = `Your name is ${first} ${last}`;

3、用反引号解决多行字符串

Es5多行字符串表达
var roadPoem = '李悝,'
+ '关关雎鸠。'
+ '春来江水绿如蓝。'
+ '能不忆江南?

var roadPoem = `李悝,
关关雎鸠。
春来江水绿如蓝。
能不忆江南?
`

4、解构赋值
解构可能是一个比较难以掌握的概念,先从简单的赋值讲起,其中house和mouse 是key,同时house和mouse也是一个变量,在Es5中是这样的:

var data = $('body').data();  //data拥有两个属性house和mouse
house = data.house;
mouse = data.mouse;

在Node.js中用ES5是这样的:

var jsonMiddleware = require('body-parser').jsonMiddleware;
var body = req.body;  //body两个属性username和password
username = body.username;
password = body.password;

在ES6中,可以使用以下语句来代替上面ES5代码

var {house,mouse} = $('body').data();
var {jsonmiddleware} = require('body-parser');
var {username, password} = req.body;

这个也同样适用于数组:

var [col1, col2] = $('.column'),
[line1, line2, line3, , line5] = file.split('n');

5、增强的对象文本
下面是ES5对象文本:

//文本对象
var serviceBase = {port: 3000, url: 'baidu.com'},
getAccounts = function() {
  return [1,2,3]
}
var accountServiceES 5 = {
   port: serviceBase.port,
   url: serviceBase.url,
   getAccounts: getAccounts,
   toString: function() {
      return JSON.stringify(this.valueOf());
   },
   getUrl: function() {
       return "http://" + this.url + ':' + this.port
   },
   valueOf_1_2_3: getAccounts()
}

如果开发者想让它更有意思,可以用Object.create 从ServiceBase继承原型的方法:

var accountServiceES 5objectCreate = Object.create(serviceBase)
var accountServiceES 5objectCreate = {
      getAccoutns: getAccounts,
      toString: function() {
          return JSON.stringify(this.valueOf());
      },
      getUrl: function(){
          return "http://" + this.url + ':' + this.port
      },
      valueOf_1_2_3: getAccounts();
}

其实对于以上两种并不是完全一致的。Object.Create()方法创建一个新对象,其是使用现有的对象来继承创建一个新的对象,而accountService ES 5 并且继承现有对象。
所以在Es6 的对象文本中,既可以直接分配getAccounts:getAccounts,也可以只需用一个getAccounts。此外,可以通过_ proto_并不是通过(proto)设置属性:

var serviceBase = {port: 3000, url: 'baidu.com'},
getAccounts = function() {return [1,2,3]};
var accountService = {
      _proto_:serviceBase,
      getAccounts,

     //另外,可以调用super防范,以及使用动态key值(valueOf_1_2_3);
    toString() {
        return JSON.stringify((super.valueOf()));
    },
    getUrl() {
        return "http://" + this.url + ':' +this.port
    },
    [ 'valueOf_' + getAccounts().join('_') ]: getAccounts()
};
console.log(accountService)

6、箭头函数
在ES6中,有丰富的箭头函数。比如,以前我们使用闭包,this总是预期之外的改变,而箭头函数的好处在于,现在this可以按照你的预期使用了,深处箭头函数里,this还是原来的this。
有了箭头函数,我们就不必用that=this或self=this、_this=this那么麻烦了。
下面是ES5

var _this = this;
$('.btn').click(function(event){
      _this.sendData();
})

在ES6中则不需要用_this = this;

$('.btn').click((event) => {
      this.sendData();
})

但不是完全否定之前的方案,ES6委员会决定,以前的function的传递方式也是一个很好的方案,所以它们仍然保留了以前的功能。
下面是另一个例子,通过call传递文本给logUpperCase()函数,在ES5中:

var logUpperCase = function(){
      var _this = this;
      this.string = this.string.toUpperCase();
      return function() {
            return console.log(_this.string);
      }
}
logUpperCase.call({string: 'ES 6 rocks'}) ();

而在ES6中并不需要用_this浪费时间:

var logUpperCase = function() {
      this.string = this.string.toUpperCase();
      return () => console.log(this.string);
}
logUpperCase.call({string: 'ES 6 rocks'})();

注意!!在ES6中,=>可以混合和匹配老的函数一起使用。当在一行代码中用了箭头函数后,它就变成了一个表达式,其将暗中返回单个语句的结果。如果结果超过一行,将需要明确使用return

在箭头函数中,对于单个参数,括号是可省略的,但当参数超过一个时就需要括号了。在ES5代码中有明确的返回功能:

var ids = ['5687868csdfsfisoduf', 'jsdlksjdk234234lk42jk34'];
var messages = ids.map(function (value, index, list){
    return 'ID of' + index + 'elment is' + value+ ' ';
})

在ES6中有更加严谨的版本,参数需要被包含在括号里并且是隐式地返回:

var ids =['5687868csdfsfisoduf', 'jsdlksjdk234234lk42jk34'];
var messages = ids.map((value, index, list) => `ID of ${index} element is ${value}`);   //隐式返回

7、Promise实现
下面是一个简单的用setTimeout()函数实现的异步延迟加载函数:

setTimeout(function () {
      console.log('Yay!');
},1000);

在ES6中,可以用Promise重写,虽然在此实例中并不能减少大量的代码。甚至多些了数行,但是逻辑却清晰了不少:

var wait1000 = new Promise((resolve, reject) => {
      setTimeout(resolve, 1000);
}).then(()=> {
      console.log('Yay!');
})

8、块作用域let
在ES6中,let并不是一个“花哨”的特性,是更复杂的。let是一种新的变量声明方式,允许我们把变量作用域控制在块级里面,用大括号定义代码块,在ES5中,块级作用域起步了任何作用:

 function calculateTotalAmount (vip) {
    //只能使用var方式定义变量
    var amount = 0;
        if(vip) {
            //在此定义会覆盖
             var amount = 1;
        }
        {
            //在此定义会覆盖
            var amount = 1000;
            {
                   //在此定义会覆盖
                      var amount = 10000;
            }
        }
      return amount;
}
//打印输出内容
console.log(calculateTotalAmount(true));
以上代码结果将返回1000,这真是一个bug。在ES6中,用let限制块级作用域,而var限制函数作用域。
function calculateTotalAmount (vip) {
      //使用var方式定义变量
      var amount = 0;
      if (vip) {
          //使用let定义的局部变量
          let amount = 1;  //第1个let
       }
       {
            let amount = 100; //第2个let
            {
                let amount = 1000; //第3个let
             }
        }
    return amount;
}
console.log(calculateTotalAmount(true));
程序结果将会是0.因为块作用域中有了let,如果(amount=1),那么这个表达式将返回1。

9、类
在之前的javascript版本中,对于类的创建和使用时令人非常头疼的一件事。不同于直接使用class命名一个类的语言(在javascript中class关键字被保留,但是没有任何作用),因为没有官方的类功能,加上大量继承模型的出现,造成了jaascript类使用的困难和不规范。
用ES6写一个类,ES6没有用函数,而是使用原型实现类,我们创建一个类baseModel,并且在这个类里定义一个constructor()和一个getName()方法:

class baseModel {
    constructor(options, data ){  //class constructor,Node.js 5.6暂时不支持options = { }, data = [ ]这样传参
        this.name = 'Base';
        this.url = 'http://baidu.com/api';
        this.data = data;
        this.options = options;
    }
    getName() {
        console.log(`Class name: ${this.name}`)
    }
}

!!!这里对options和data使用了默认参数值,方法名也不需要加function关键字,而且冒号“:”也不需要了;另一个大的区别就是不需要分配属性this。现在设置一个属性的值,只需简单的在构造函数中分配即可。
10、模块
ES6中可以用模块import和export操作了。
在ES5中,可以在<script>中直接写可以运行的代码(简称IIFE),或一些库,如AMD。然而在ES6中,可以用export导入类。下面举个例子,在ES5中,module.js有port变量和getAccounts()方法:

  module.exports = {
    port: 3000,
    getAccounts: function() {
        ...
    }
}

在ES5中,main.js需要依赖require('module')导入module.js:

var service = require('module.js');
console.log(service.port);

但在ES6中,将用export and import进行一个模块的引入和抛出。例如,以下是用ES6写的module.js文件库:

export var port = 3000;
export function getAccounts(url) {
  ...
}

如果用ES6将上述的module.js导入到文件main.js中,就变得非常简单了,只需要用import { port,getAccounts} from 'module';
console.log(port); //3000
或者可以在main.js中导入整个模块,并命名为service:
import * as service from 'module';
console.log(service.port); //3000

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容

  • ES6(ECMAScript2015)的出现,无疑给前端开发人员带来了新的惊喜,它包含了一些很棒的新特性,可以更加...
    cbw100阅读 15,416评论 3 233
  • 前言 本文讲着重是对ES6语法特性的补充,不会讲解一些API层面的语法,更多的是发掘背后的原理,以及ES6到底解决...
    coderfl阅读 691评论 0 0
  • 原文链接分享在我的掘金账号上近一万字的ES6语法知识点补充 前言 ECMAScript 6.0(简称ES6),作为...
    心_c2a2阅读 910评论 0 18
  • 前言 ECMAScript 6.0(简称ES6),作为下一代JavaScript的语言标准正式发布于2015 年 ...
    grain先森阅读 3,596评论 1 128
  • 前言 ECMAScript 6.0(简称ES6),作为下一代JavaScript的语言标准正式发布于2015 年 ...
    小雨雪smile阅读 1,485评论 0 50