简介

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

语法

箭头函数、this

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

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

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

function aa(){
this.bb = 1;
setTimeout(() => {
this.bb++; //this指向aa
console.log(this.bb);
},500);
} aa(); //

let、const

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

  • const 用来声明一个常量,但也并非一成不变的
  • let 和 const 只在最近的一个块中(花括号中)有效

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

Classes

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

class Animal {
constructor(){
console.log('我是一个动物');
}
} class Person extends Animal {
constructor(){
super();
console.log('我是一个程序员');
}
} let aa = new Person();
//我是一个动物
//我是一个程序员

解构

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

没啥说的,直接上代码:

//通常情况下
var first = someArray[0];
var second = someArray[1];
var third = someArray[2]; //解构赋值
let [first, second, third] = someArray; //比上面简洁多了吧 //还有下面例子
let [,,third] = [1,2,3];
console.log(third); // let [first,...last] = [1,2,3];
console.log(last); //[2,3] //对象解构
let {name,age} = {name: "lisi", age: "20"};
console.log(name); //lisi
console.log(age); // let {ept} = {};
console.log(ept); //undefined

Rest + Spread

"..."

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

对象字面量扩展

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

模版字符串

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

`This is a pretty little template string.`

`In ES5 this is
not legal.` let name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`

Iterators(迭代器)

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

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

Generators

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

Run-Stop-Run...

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

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

for…of && for…in

for…of 遍历(数组)

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

for…in 遍历对象中的属性

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

Map + Set + WeakMap + WeakSet

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

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

// Sets
var s = new Set();
s.add("hello").add("goodbye").add("hello");
s.size === 2;
s.has("hello") === true; // Maps
var m = new Map();
m.set("hello", 42);
m.set(s, 34);
m.get(s) == 34; // Weak Maps
var wm = new WeakMap();
wm.set(s, { extra: 42 });
wm.size === undefined // Weak Sets
var ws = new WeakSet();
ws.add({ data: 42 });

Proxies

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

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

Symbols

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

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

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

Promises

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

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

function timeout(duration = 0) {
return new Promise((resolve, reject) => {
setTimeout(resolve, duration);
})
} var p = timeout(1000).then(() => {
return timeout(2000);
}).then(() => {
throw new Error("hmm");
}).catch(err => {
return Promise.all([timeout(100), timeout(200)]);
})

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

小结

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

ES6新语法概览的更多相关文章

  1. ES6新语法

    ES6新语法概览 简介 ES6是JavaScript语言的新一代标准,加入了一些新的功能和语法,正式发布于2015年6月,亦称ES2015:该标准由ECMA(欧洲计算机制造联合会)的第39号技术专家委 ...

  2. 你不知道的JavaScript--Item24 ES6新特性概览

    ES6新特性概览 本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代 ...

  3. ES6新语法的介绍

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

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

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

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

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

  6. ES6新特性概览

    本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony( ...

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

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

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

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

  9. ES6新特性概览1

    本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony( ...

随机推荐

  1. linux使用wget下载https开头url的文件

    可以使用命令 : 比如我们可以修改成: wget --no-check-certificate https://我们下载文件路径 来自: http://www.laozuo.org/3648.html

  2. IIS-反向代理配置&&插件安装

    参考:https://www.cnblogs.com/pengcc/p/4329207.html 网络上好多开场的文章就说了好多的原理之类的这里我们直接开始配置.不过也要简单说下win下配置反向代理只 ...

  3. 【Struts 动态表单】DynaActionForm

    RegisterAction package k.action; import org.apache.struts.action.ActionForm; import org.apache.strut ...

  4. 【MySQL】安装及配置

    " 目录 #. 概述 1. 什么是数据(Data) 2. 什么是数据库(DataBase, 简称DB) 3. 什么是数据库管理系统(DataBase Management System) 4 ...

  5. DBC里首饰不同代码的含义

    DuraMax"这个就是我们要找的物件持久的属性了,一开始怎么也找不到,原来这里的变量中 "1000"表示1个持久度,那么"40000"就表示40个持 ...

  6. python编程出现:expected an indented block错误。

    python编程出现:expected an indented block错误. expected an indented block翻译为:应为缩进块. python中没有像C语言使用{}来表示从属 ...

  7. C语言:去除一个字符串中所有的空格。-函数fun传入形参m,求t=1/2-1/3+1/4.....+1/m的值。-判断形参a指定的矩阵是不是“幻方“。

    //函数fun功能:判断形参a指定的矩阵是不是“幻方“,若是返回1.(”幻方”:每列,每行,对角线,反对角线相加都相等) #include <stdio.h> #define N 3 in ...

  8. Docker容器CPU限制选项测试

    目录 Docker容器CPU限制选项测试 参考 实验环境 --cpu-shares选项 测试 结论 --cpus选项 测试 结论 --cpuset-cpus选项 测试 结论 Docker容器CPU限制 ...

  9. 工具 - SDK安装

    Why 在deepin linux上安装Java很头疼.. How 于是有了sdk man! https://sdkman.io/ sdk list java sdk install java < ...

  10. leetcode菜鸡斗智斗勇系列(9)--- Range Sum of BST

    1.原题: https://leetcode.com/problems/range-sum-of-bst/ Given the root node of a binary search tree, r ...