ES6新语法概览

简介

ES6是JavaScript语言的新一代标准,加入了一些新的功能和语法,正式发布于2015年6月,亦称ES2015;该标准由ECMA(欧洲计算机制造联合会)的第39号技术专家委员会(TC39)制订,ES7正在制订中,据称会在2017年发布。

语法

箭头函数、this

ES6中可以使用 => 作为函数表达形式,极简风格,参数+ => +函数体。

  1. var foo = function(){return 1;};
  2. //等价于
  3. let foo = () => 1;
  1. let nums = [1,2,3,5,10];
  2. let fives = [];
  3. nums.forEach(v => {
  4. if (v % 5 === 0)
  5. fives.push(v);
  6. });
  7. console.log(fives); //[5,10]

箭头函数中的 this 指的不是window,是对象本身。

  1. function aa(){
  2. this.bb = 1;
  3. setTimeout(() => {
  4. this.bb++; //this指向aa
  5. console.log(this.bb);
  6. },500);
  7. }
  8. aa(); //2

let、const

  • ES6 推荐在函数中使用 let 定义变量

  • const 用来声明一个常量,但也并非一成不变的

  • let 和 const 只在最近的一个块中(花括号中)有效

  1. var a = 1;
  2. {
  3. let a = 2;
  4. console.log(a); //2
  5. }
  6. console.log(a); //1
  1. const A = [1,2];
  2. A.push = 3;
  3. console.log(A); //[1,2,3]
  4. A = 10; //Error

Classes

ES6中增加了类的概念,其实ES5中已经可以实现类的功能了,只不过使用Class实现可以更加清晰,更像面向对象的写法。

  1. class Animal {
  2. constructor(){
  3. console.log('我是一个动物');
  4. }
  5. }
  6. class Person extends Animal {
  7. constructor(){
  8. super();
  9. console.log('我是一个程序员');
  10. }
  11. }
  12. let aa = new Person();
  13. //我是一个动物
  14. //我是一个程序员

解构

解构赋值是ES6中推出的一种高效、简洁的赋值方法

没啥说的,直接上代码:

  1. //通常情况下
  2. var first = someArray[0];
  3. var second = someArray[1];
  4. var third = someArray[2];
  5. //解构赋值
  6. let [first, second, third] = someArray; //比上面简洁多了吧
  7. //还有下面例子
  8. let [,,third] = [1,2,3];
  9. console.log(third); //3
  10. let [first,...last] = [1,2,3];
  11. console.log(last); //[2,3]
  12. //对象解构
  13. let {name,age} = {name: "lisi", age: "20"};
  14. console.log(name); //lisi
  15. console.log(age); //20
  16. let {ept} = {};
  17. console.log(ept); //undefined

Rest + Spread

"..."

  1. //Rest
  2. function f(x, ...y) {
  3. return x * y.length;
  4. }
  5. f(3, "hello", true) == 6
  6. //Spread
  7. function f(x, y, z) {
  8. return x + y + z;
  9. }
  10. f(...[1,2,3]) == 6

对象字面量扩展

  • 可以在对象字面量里面定义原型
  • 定义方法可以不用function关键字
  • 直接调用父类方法
  1. //通过对象字面量创建对象
  2. var human = {
  3. breathe() {
  4. console.log('breathing...');
  5. }
  6. };
  7. var worker = {
  8. __proto__: human, //设置此对象的原型为human,相当于继承human
  9. company: 'freelancer',
  10. work() {
  11. console.log('working...');
  12. }
  13. };
  14. human.breathe();//输出 ‘breathing...’
  15. //调用继承来的breathe方法
  16. worker.breathe();//输出 ‘breathing...’

模版字符串

ES6中提供了用反引号`来创建字符串,里面可包含${…}等

  1. `This is a pretty little template string.`
  2. `In ES5 this is
  3. not legal.`
  4. let name = "Bob", time = "today";
  5. `Hello ${name}, how are you ${time}?`

Iterators(迭代器)

ES6 中可以通过 Symbol.iterator 给对象设置默认的遍历器,直到状态为true退出。

  1. var arr = [11,12,13];
  2. var itr = arr[Symbol.iterator]();
  3. itr.next(); //{ value: 11, done: false }
  4. itr.next(); //{ value: 12, done: false }
  5. itr.next(); //{ value: 13, done: false }
  6. itr.next(); //{ value: undefined, done: true }

Generators

ES6中非常受关注的的一个功能,能够在函数中间暂停,一次或者多次,并且之后恢复执行,在它暂停的期间允许其他代码执行,并可以用其实现异步。

Run-Stop-Run...

  1. function *foo(x) {
  2. var y = 2 * (yield (x + 1));
  3. var z = yield (y / 3);
  4. return (x + y + z);
  5. }
  6. var it = foo( 5 );
  7. console.log( it.next() ); // { value:6, done:false }
  8. console.log( it.next( 12 ) ); // { value:8, done:false }
  9. console.log( it.next( 13 ) ); // { value:42, done:true }

generator能实现好多功能,如配合for...of使用,实现异步等等,我在这里就不多说了,详见。

for…of && for…in

for…of 遍历(数组)

  1. let arr = [1,2,3];
  2. for (let itr of arr) {
  3. console.log(itr); //1 2 3
  4. }

for…in 遍历对象中的属性

  1. let arr = [1,2,3];
  2. arr.aa = 'bb';
  3. for (let itr in arr) {
  4. console.log(itr); //0 1 2 aa
  5. }

Map + Set + WeakMap + WeakSet

  • Set 对象是一组不重复的值,重复的值将被忽略,值类型可以是原始类型和引用类型

  • WeakSet是一种弱引用,同理WeakMap

  1. // Sets
  2. var s = new Set();
  3. s.add("hello").add("goodbye").add("hello");
  4. s.size === 2;
  5. s.has("hello") === true;
  6. // Maps
  7. var m = new Map();
  8. m.set("hello", 42);
  9. m.set(s, 34);
  10. m.get(s) == 34;
  11. // Weak Maps
  12. var wm = new WeakMap();
  13. wm.set(s, { extra: 42 });
  14. wm.size === undefined
  15. // Weak Sets
  16. var ws = new WeakSet();
  17. ws.add({ data: 42 });

Proxies

Proxy可以监听对象身上发生了什么事情,并在这些事情发生后执行一些相应的操作。

  1. //定义被侦听的目标对象
  2. var engineer = { name: 'Joe Sixpack', salary: 50 };
  3. //定义处理程序
  4. var interceptor = {
  5. set: function (receiver, property, value) {
  6. console.log(property, 'is changed to', value);
  7. receiver[property] = value;
  8. }
  9. };
  10. //创建代理以进行侦听
  11. engineer = Proxy(engineer, interceptor);
  12. //做一些改动来触发代理
  13. engineer.salary = 60;
  14. //控制台输出:salary is changed to 60

Symbols

Symbol 是一种新的数据类型,它的值是唯一的,不可变的。ES6 中提出 symbol 的目的是为了生成一个唯一的标识符,不过你访问不到这个标识符.

  1. var sym = Symbol( "Symbol" );
  2. console.log(typeof sym); // symbol

如果要获取对象 symbol 属性,需要使用Object.getOwnPropertySymbols(o)

Promises

  • ES6 对 Promise 有了原生的支持,一个 Promise 是一个等待被异步执行的对象,当它执行完成后,其状态会变成 resolved 或者 rejected

  • Promises是处理异步操作的一种模式,之前在很多三方库中有实现,比如jQuery的 deferred 对象。当你发起一个异步请求,并绑定了.when(), .done()等事件处理程序时,其实就是在应用promise模式

  1. function timeout(duration = 0) {
  2. return new Promise((resolve, reject) => {
  3. setTimeout(resolve, duration);
  4. })
  5. }
  6. var p = timeout(1000).then(() => {
  7. return timeout(2000);
  8. }).then(() => {
  9. throw new Error("hmm");
  10. }).catch(err => {
  11. return Promise.all([timeout(100), timeout(200)]);
  12. })

想要了解promise实际应用等,详见。

小结

总之,ES6还是有很多棒棒的语法,有利于精简代码,高效开发;只不过一些低级别浏览器不支持,可以用Babel等工具把ES6转化成ES5,但是有些语法还是不够完善;但是在不久的将来,ES6一定会成为主流的。对了,还有ES7、8、9……

REFERENCE

by Lock

Feel free to repost but keep the link to this page please!

ES6新语法的更多相关文章

  1. ES6新语法的介绍

    对于ES6新语法,阮一峰有一篇文章介绍的挺详细 http://es6.ruanyifeng.com/#docs/destructuring

  2. ES6新语法之let关键字;有别于传统关键字var的使用

    ES6新语法于2015年发布:而我这个前端小白在17年才接触到.惭愧惭愧!!不过到目前为止,似乎只有FireFox和Chrome对ES6的支持相对良好.不过既然人家ES6已经出来了,还是要跟上技术的潮 ...

  3. ES6入门五:箭头函数、函数与ES6新语法

    箭头函数的基本用法与特点 函数与ES6新语法 一.箭头函数的基本用法与特点 声明箭头函数采用声明变量和常量的关键字:var.let.const 箭头函数的参数:没有参数用"()"空 ...

  4. 总结常见的ES6新语法特性

    前言 ES6是即将到来的新版本JavaScript语言的标准,他给我们带来了更"甜"的语法糖(一种语法,使得语言更容易理解和更具有可读性,也让我们编写代码更加简单快捷),如箭头函数 ...

  5. 总结常见的ES6新语法特性。

    前言 ES6是即将到来的新版本JavaScript语言的标准,他给我们带来了更"甜"的语法糖(一种语法,使得语言更容易理解和更具有可读性,也让我们编写代码更加简单快捷),如箭头函数 ...

  6. ES6 | ES6新语法 在编码实践中的应用

    本章探讨如何将 ES6 的新语法,运用到编码实践之中,与传统的 JavaScript 语法结合在一起,写出合理的.易于阅读和维护的代码. 多家公司和组织已经公开了它们的风格规范,本文的内容主要参考了  ...

  7. es6新语法系列,查找字符串,模板字符串

    一.模板字符串: ES6引入了一种新型的字符串字面量语法,我们称之为模板字符串(template strings).除了使用反撇号字符 ` 代替普通字符串的引号 ' 或 " 外,它们看起来与 ...

  8. ES6新语法(一)

    1.常量         ES5没有定义声明常量的方式,ES6标准中引入了新的关键字const来定义常量.         常量必须给初始值: 常量不能在同一作用域内重新定义或赋值:  <scr ...

  9. es6 新语法分享给爱前端的伙伴

    相信es6大家并不陌生,那么我还是简单介绍一下es6,es是15年发布的,可以用babel转化成es5可以支持低端浏览器,es6是一种新的语法,流行的库基本都是基于es6开发的.所以小伙伴要掌握哦!而 ...

随机推荐

  1. Airflow Python工作流引擎的重要概念介绍

    Airflow Python工作流引擎的重要概念介绍 - watermelonbig的专栏 - CSDN博客https://blog.csdn.net/watermelonbig/article/de ...

  2. mysql多表多字段查询并去重

    mysql多表多字段查询并去重 - MySQL-ChinaUnix.nethttp://bbs.chinaunix.net/forum.php?mod=viewthread&tid=42549 ...

  3. 开发神器之PHPstorm配置及使用

    之前文章对于PHPstorm有了简单的介绍,作为一名合格的PHPer,一定要定制一个适合自己的IDE,然后开始我们的路途吧... 1. 为不同的项目选定PHP版本 我们经常会遇到这样的场景,不同的项目 ...

  4. 【zabbix教程系列】二、zabbix特点

    一.度量收集 从任何设备,系统,应用上收集指标,收集指标的方法有: 多平台zabbix代理 SNMP and IPMI 代理 无代理监控用户服务 自定义方法 计算和聚合 用户端web监控  二.问题发 ...

  5. java基础3之IO

    流 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接.类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流. 流的种类 字符 ...

  6. root密码重置、Linux目录结构和远程连接Linux

    一.root如何重置密码 1. 重启 Linux 系统主机并出现引导界面时,按下键盘上的 e 键进入内核编辑界面 2. 在 linux16 参数这行的最后面追加“rd.break”参数,然后按下 Ct ...

  7. Word自定义多级列表样式

    Word自定义多级列表样式: 1. 2. 3.取个名字 在这里鼠标移上时显示 : 4. 5. 定义完成,即可使用:

  8. CodeForces666E Forensic Examination

    题目描述 给你一个串S以及一个字符串数组T[1..m],q次询问,每次问S的子串S[pl​..pr​]在T[l..r]中的哪个串里的出现次数最多,并输出出现次数. 如有多解输出最靠前的那一个. 题解 ...

  9. [WC2007]剪刀石头布(最大流)

    洛古 一句话题意:给定一张图,每两点之间有一条有向边或无向边,把所有无向边定向,使图中三元环个数尽量多 因为原图是一个完全图,假设图中任意三点都能构成三元环,那么途中三元环的个数为:\(\binom{ ...

  10. POJ--3974 Palindrome(回文串,hash)

    链接:点击这里 #include<iostream> #include<algorithm> #include<stdio.h> #include<cstri ...