1.什么是es6

ECMAScript 6.0(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。

ECMAScript和JavaScript的关系是,前者是后者的规格,后者是前者的一种实现。

es6入门文档:http://caibaojian.com/es6/

2.node中使用es6

Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在现有环境执行。

2.1配置文件 .babelrc

Babel的配置文件是.babelrc,存放在项目的根目录下。使用Babel的第一步,就是配置这个文件。该文件用来设置转码规则和插件,基本格式如下:

  1. {
  2. "presets": [],
  3. "plugins": []
  4. }

2.2安装es6转换模块

presets字段设定转码规则,官方提供以下的规则集,你可以根据需要安装。

  1. // ES2015转码规则
  2. $ npm install --save-dev babel-preset-es2015
  3. // react转码规则
  4. $ npm install --save-dev babel-preset-react
  5. // ES7不同阶段语法提案的转码规则(共有4个阶段),选装一个
  6. $ npm install --save-dev babel-preset-stage-0
  7. $ npm install --save-dev babel-preset-stage-1
  8. $ npm install --save-dev babel-preset-stage-2
  9. $ npm install --save-dev babel-preset-stage-3

然后,将这些规则加入.babelrc

  1. {
  2. "presets": [
  3. "es2015",
  4. "react",
  5. "stage-2"
  6. ],
  7. "plugins": []
  8. }

注意,Babel工具和模块的使用,都必须先写好.babelrc

2.3全局安装命令行工具

Babel提供babel-cli工具,用于命令行转码。

cnpm install babel‐cli ‐g

2.4使用

babel-node js文件名

3.语法新特性

3.1 变量声明let

在es6之前,var关键字声明变量。无论声明在何处,都会被视为声明在函数的最顶部,这是函数变量的提升。如下:

  1. function aa() {
  2.     if(bool) {
  3. //声明变量
  4.         var test = 'hello man'
  5.     } else {
  6.         console.log(test)
  7.     }
  8. }

上面代码实际是:

  1. function aa() {
  2.     var test // 变量提升
  3.     if(bool) {
  4.         test = 'hello man'
  5.     } else {
  6.         //此处访问test 值为undefined
  7.         console.log(test)
  8.     }
  9.     //此处访问test 值为undefined
  10. }

es6后,通常用let和const来声明,let表示变量、const表示常量。let和const都是块级作用域(在一个函数内部 ,在一个代码块内部)。如下:

  1. //变量声明let
  2. function test(b){
  3. if(b){
  4. //var 全局变量; let 局部变量
  5. let a = 'abc';
  6. }
  7. //a 在此处访问不到
  8. console.log(a);
  9. }
  10. test(true);

终端运行:node demo1,会报错:ReferenceError: a is not defined

3.2 常量声明

const用于常量声明:

  1. //常量声明,常量不能进行改变
  2. const name = 'abc';
  3. // name = "xyz"; //再次赋值会报错
  4. console.log(name);

3.3 模板字符串

反引号(``),是es6模板字符串

1.字符串格式化

将表达式嵌入字符串中进行拼接。用${}来界定。

  1. //1.字符串拼接
  2. //ES5
  3. var name = 'abc';
  4. console.log("你好,"+name+"欢迎来到十次方世界");
  5. //ES6 模板字符串
  6. let name2 = 'xyz';
  7. //反引号`是esc键下面的英文符 ${}界定
  8. console.log(`你好,${name2}欢迎来到十次方世界`);

2.换行

  1. //2.换行
  2. //ES5
  3. var info = "Hi \
  4.     man!"
  5. //ES6
  6. var info = `<div>
  7.         <span>hello world</span>
  8.     </div>`

3.4 函数默认参数

es6为函数参数提供了默认值。在定义函数时便初始化函数参数,以便在参数没有被传递前去使用。

  1. //函数默认参数
  2. function test(num = 200){
  3. console.log(num);
  4. }
  5. test();
  6. test(500);

3.5 箭头函数

就是函数的快捷写法。最直观的三个特点:

1.不需要function关键字来创建函数

2.省略return关键字

3.继承当前上下文的 this 关键字

  1. //ES5
  2. var add = function(a,b){
  3. return a+b;
  4. }
  5. //ES6
  6. var add2 = (a,b) => {
  7. return a+b;
  8. }
  9. //当函数体中只有return语句时,可简写成下面
  10. var add3 = (a,b) => a+b;
  11. console.log(add(100,200));
  12. console.log(add2(100,200));
  13. console.log(add3(100,200));

3.6 对象初始化简写

ES6允许在对象之中,直接写变量。这时,属性名为变量名, 属性值为变量的值。

  1. function f(x, y) {
  2. return {x, y};
  3. }
  4. // 等同于
  5. function f(x, y) {
  6. return {x: x, y: y};
  7. }
  8. f(1, 2) // Object {x: 1, y: 2}
  9. //JSON.stringify()把jsonObject转化为jsonString
  10. console.log(JSON.stringify(people("abc",12)));

除了属性简写,方法也可以简写。

  1. var birth = '2000/01/01';
  2. var Person = {
  3. name: '张三',
  4. //等同于birth: birth
  5. birth,
  6. // 等同于hello: function ()...
  7. hello() { console.log('我的名字是', this.name); }
  8. };

3.7 变量的解构赋值

ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。

1.数组的解构赋值

  1. let [foo, [[bar], baz]] = [1, [[2], 3]];
  2. foo // 1
  3. bar // 2
  4. baz // 3
  5. let [ , , third] = ["foo", "bar", "baz"];
  6. third // "baz"
  7. let [x, , y] = [1, 2, 3];
  8. x // 1
  9. y // 3
  10. let [head, ...tail] = [1, 2, 3, 4];
  11. head // 1
  12. tail // [2, 3, 4]
  13. //解构不成功,变量的值都会等于`undefined`
  14. let [x, y, ...z] = ['a'];
  15. x // "a"
  16. y // undefined
  17. z // []
  18. //不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组
  19. let [a, [b], d] = [1, [2, 3], 4];
  20. a // 1
  21. b // 2
  22. d // 4
  23. //默认值
  24. var [foo = true] = [];
  25. foo // true
  26. [x, y = 'b'] = ['a']; // x='a', y='b'
  27. [x, y = 'b'] = ['a', undefined]; // x='a', y='b'

2.对象的解构赋值

对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。

  1. //1.属性名与变量名一致
  2. var { bar, foo } = { foo: "aaa", bar: "bbb" };
  3. foo // "aaa"
  4. bar // "bbb"
  5. var { baz } = { foo: "aaa", bar: "bbb" };
  6. baz // undefined
  7. //2.属性名与变量名不一致
  8. var { foo: baz } = { foo: 'aaa', bar: 'bbb' };
  9. baz // "aaa"
  10. let obj = { first: 'hello', last: 'world' };
  11. let { first: f, last: l } = obj;
  12. f // 'hello'
  13. l // 'world'

对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。

  1. var { foo: baz } = { foo: "aaa", bar: "bbb" };
  2. baz // "aaa"
  3. foo // error: foo is not defined

foo是匹配的模式,baz才是变量。真正被赋值的是变量baz,而不是模式foo。注意,采用这种写法时,变量的声明和赋值是一体的。对于letconst来说,变量不能重新声明,所以一旦赋值的变量以前声明过,就会报错。

  1. let foo;
  2. ({foo} = {foo: 1}); // 成功
  3. let baz;
  4. ({bar: baz} = {bar: 1}); // 成功

let命令下面一行的圆括号是必须的,否则会报错。因为解析器会将起首的大括号,理解成一个代码块,而不是赋值语句。

解构也可以用于嵌套结构的对象:

  1. var obj = {
  2. p: [
  3. 'Hello',
  4. { y: 'World' }
  5. ]
  6. };
  7. var { p: [x, { y }] } = obj;
  8. x // "Hello"
  9. y // "World"

注意,这时p是模式,不是变量,因此不会被赋值。

3.8 Spread Operator

扩展运算符(...组装对象或数组。

  1. //组装数组
  2. const color = ['red','green']
  3. const colorful = [...color,'pink']
  4. console.log(colorful) //[ 'red', 'green', 'pink' ]
  5. //组装对象
  6. const people = {name: 'xyz', address: 'aaaaa'}
  7. const peopleful = {...people, age: 18}
  8. console.log( JSON.stringify(peopleful))//{"name":"xyz","address":"aaaaa","age":18}

3.9 import和export

import导入模块、export导出模块。

创建lib.js

  1. let fn0 = function(){
  2. console.log('fno...')
  3. }
  4. export {fn0}

创建demo9.js

  1. import {fn0} from './lib'
  2. fn0()

注意:node(v8.x)本身并不支持import关键字,所以我们需要使用babel的命令行工具来执行

babel-node demo9

3.10 Promise对象

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。Promise提供统一的API,各种异步操作都可以用同样的方法进行处理。

Promise对象有以下两个特点:

1.对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成,又称Fulfilled)和Rejected(已失败)。

2.一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从Pending变为Resolved和从Pending变为Rejected

基本用法:

ES6规定,Promise对象是一个构造函数,用来生成Promise实例。

  1. var promise = new Promise(function(resolve, reject) {
  2. // ... some code
  3. if (/* 异步操作成功 */){
  4. resolve(value);
  5. } else {
  6. reject(error);
  7. }
  8. });

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolvereject。它们是两个函数,由JavaScript引擎提供,不用自己部署。

Promise实例生成以后,可以用then方法分别指定Resolved状态和Reject状态的回调函数。

  1. promise.then(function(value) {
  2. // success
  3. }, function(error) {
  4. // failure
  5. });

Promise新建后就会立即执行。

  1. let promise = new Promise(function(resolve, reject) {
  2. console.log('Promise');
  3. resolve();
  4. });
  5. promise.then(function() {
  6. console.log('Resolved.');
  7. });
  8. console.log('Hi!');
  9. // Promise
  10. // Hi!
  11. // Resolved

Promise新建后立即执行,所以首先输出的是“Promise”。然后,then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行,所以“Resolved”最后输出。

下面是一个用Promise对象实现的Ajax操作的例子:

  1. var getJSON = function(url) {
  2. var promise = new Promise(function(resolve, reject){
  3. var client = new XMLHttpRequest();
  4. client.open("GET", url);
  5. client.onreadystatechange = handler;
  6. client.responseType = "json";
  7. client.setRequestHeader("Accept", "application/json");
  8. client.send();
  9. function handler() {
  10. if (this.readyState !== 4) {
  11. return;
  12. }
  13. if (this.status === 200) {
  14. resolve(this.response);
  15. } else {
  16. reject(new Error(this.statusText));
  17. }
  18. };
  19. });
  20. return promise;
  21. };
  22. getJSON("/posts.json").then(function(json) {
  23. console.log('Contents: ' + json);
  24. }, function(error) {
  25. console.error('出错了', error);
  26. });

getJSON是对XMLHttpRequest对象的封装,用于发出一个针对JSON数据的HTTP请求,并且返回一个Promise对象。需要注意的是,在getJSON内部,resolve函数和reject函数调用时,都带有参数。

如果调用resolve函数和reject函数时带有参数,那么它们的参数会被传递给回调函数。reject函数的参数通常是Error对象的实例,表示抛出的错误;resolve函数的参数除了正常的值以外,还可能是另一个Promise实例,表示异步操作的结果有可能是一个值,也有可能是另一个异步操作。

es6基本介绍及使用的更多相关文章

  1. es6 let介绍及应用场景

    关于更多es6建议去看阮一峰的博客~ es6入门:http://es6.ruanyifeng.com/ 源码仓库:https://github.com/ruanyf/es6tutorial let介绍 ...

  2. 35.ES6语法介绍——2019年12月24日

    2019年12月24日16:22:24 2019年10月09日12:04:44 1. ES6介绍 1.1 新的 Javascript 语法标准 --2015年6月正式发布 --使用babel语法转换器 ...

  3. ES5和ES6基本介绍与面向对象的基本思想

    ES6和ES5基本介绍 let  const  关键词定义变量 let 定义变量 特点: let 定义的变量,不会进行预解析  let 定义的变量,与 forEach() 中的变量类似  每次执行都会 ...

  4. JavaScript、ES5和ES6的介绍和区别

    JavaScript由三部分组成: ECMAScript(核心) DOM(文档对象模型) BOM (浏览器对象模型) ES5(ECMAScript第五个版本) strict模式 严格模式,限制一些用法 ...

  5. ES6的介绍和常用语法

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 前言 ECMAScript 是 JS 的语言标准.而 ES6 是新的 J ...

  6. es6简单介绍

    1.ECMAScript 6 简介 2.let和const命令 3.变量的解构赋值 4.字符串的扩展之模板字符串 5.正则的扩展 6.数值的扩展 7.函数的扩展 8.数组的扩展 9.对象的扩展 10. ...

  7. Vue学习【第二篇】:ES6简单介绍

    ECMAScript 6简介 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了.它的目标,是使得 JavaScript ...

  8. ES6的模块化

    在之前的 javascript 中一直是没有模块系统的,前辈们为了解决这些问题,提出了各种规范, 最主要的有CommonJS和AMD两种.前者用于服务器,后者用于浏览器.而 ES6 中提供了简单的模块 ...

  9. 34.js----JS 开发者必须知道的十个 ES6 新特性

    JS 开发者必须知道的十个 ES6 新特性 这是为忙碌的开发者准备的ES6中最棒的十个特性(无特定顺序): 默认参数 模版表达式 多行字符串 拆包表达式 改进的对象表达式 箭头函数 =&> ...

随机推荐

  1. 自定义指令 限制input 的输入位数

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  2. MySQL简版(二)

    第一章 表的约束 1.1 概念 对表中的数据进行限定,保证数据的正确性.有效性和完整性. 1.2 分类 主键约束:primary key. 非空约束:not null. 唯一约束:unique. 外键 ...

  3. [Comet OJ - Contest #9 & X Round 3] Namid[A]me

    传送门 一开始读错题了,以为是\(\sum_{1\leq u\leq v\leq n}f(u,v)\),还疑惑这题这么简单怎么没人做( 实际上是\(\sum_{1\leq u\leq v\leq n} ...

  4. 32.密码学知识-SSL/TLS-9——2019年12月19日

    9. SSL/TLS "SSL/TLS --- 为了更安全的通信" 本章中我们将学习SSL/TLS的相关知识. SSL/TLS是世界上应用最广泛的密码通信方法.比如说,当在网上商城 ...

  5. System.currentTimeMillis和System.nanoTime()

    ns(nanosecond):纳秒, 时间单位.一秒的10亿分之一,即等于10的负9次方秒.常用作 内存读写速度的单位.  1纳秒=0.000001 毫秒  1纳秒=0.00000 0001秒 jav ...

  6. Thread的几种方法的使用

    1:setPriority() 设置线程的优先级,从1 到10.   5是默认的.  1是最低优先级. 10是最高优先级 public class MyThread01 implements Runn ...

  7. 果蝇优化算法(FOA)

    果蝇优化算法(FOA) 果蝇优化算法(Fruit Fly Optimization Algorithm, FOA)是基于果蝇觅食行为的仿生学原理而提出的一种新兴群体智能优化算法. 果蝇优化算法(FOA ...

  8. CF 480 B Long Jumps (map标记)

    题目链接:http://codeforces.com/contest/480/problem/B 题目描述:     Long Jumps   Valery is a PE teacher at a ...

  9. POJ 1363 Rails(栈)

    题目代号:POJ 1363 题目链接:http://poj.org/problem?id=1363 题目原题: Rails Time Limit: 1000MS   Memory Limit: 100 ...

  10. JavaScript异步编程助手:Promise模式

    :Promises是一种令代码异步行为更加优雅的抽象,它很有可能是JavaScript的下一个编程范式,一个Promise即表示任务结果,无论该任务是否完成. 异步模式在Web编程中变得越来越重要,对 ...