简介

  • Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。

  • Node.js 4.0.0这个版本是Node和iojs合并后发布的首个稳定版本,并且为开发者带来了大量的ES6语言扩展。了解 Node.js中包括的ES6语言扩展。本课将会为你介绍如何使用这些新特性。

  • Node.js 4.0.0 可以让您享受最尖端的技术,保持项目的先进性。其中对 v8 的升级几乎做到了与 Chromium / Google Chrome 同步,达到了 4.5.x,它提供了很多新的语言功能。ECMA-262 是 JavaScript 语言规范的最新版本,而且好多新特性数都是开箱即用的。

这些新特性包括:

  • classes - 各种 ‘类’,再也无需用 CoffeeScript 的语法糖写类了

  • generators - 未来的.js 代码中将有无数生成器,不学一点就看不懂 JS 代码了哦

  • collections - 集合、映射、弱集合、弱映射

  • arrow functions - 箭向函数

  • block scoping - 使用 let 、const 作用域,块辖域

  • template strings - 模板字串

  • promises - 用标准化了的方法进行延迟和异步计算

  • symbols - 唯一的、不可修改的数据

严格模式

严格模式在语义上与正常的JavaScript有一些不同。

  • 首先,严格模式会将JavaScript陷阱直接变成明显的错误。

  • 其次,严格模式修正了一些引擎难以优化的错误:同样的代码有些时候严格模式会比非严格模式下更快。

  • 第三,严格模式禁用了一些有可能在未来版本中定义的语法。

因为我们ECMAScript 6中的一些特性,必须在严格模式下,才可以使用,而不报错。

严格模式可以应用到整个script标签或某个别函数中。

为整个script标签开启严格模式, 需要在所有语句之前放一个特定语句 “use strict”; (或 ‘use strict’;)

// 整个语句都开启严格模式的语法
"use strict";let v = "Hi!  I'm a strict mode script!";

同样的,要给某个函数开启严格模式,得把 “use strict”; (或 ‘use strict’; )声明一字不漏地放在函数体所有语句之前。

function strict()
{
// 函数级别严格模式语法
'use strict';
return "Hi! I'm a strict mode function!" ;
}
function notStrict() {
return "I'm not strict.";
}

let

let 允许把变量的作用域限制在块级域中。与 var 不同处是:var 申明变量要么是全局的,要么是函数级的,而无法是块级的。

let vs var

let的作用域是块,而var的作用域是函数

'use strict';
var a = 5;
var b = 10;
if (a === 5) {
let a = 4; // The scope is inside the if-block
var b = 1; // The scope is inside the function
console.log(a); // 4
console.log(b); // 1
}
console.log(a); // 5
console.log(b); // 1

let在循环中

可以使用let关键字绑定变量在循环的范围而不是使用一个全局变量(使用var)定义。

'use strict';
for (let i = 0; i < 10; i++) {
console.log(i); // 0, 1, 2, 3, 4 ... 9
}
console.log(i); // i is not defined

上面报错,因为变量i不存在于for语句外的作用域中。let创建块级作用域变量的,使用var创建一个全局变量。

const

const这个声明创建一个常量,可以全局或局部的函数声明。

一个常量可以是全局的或者是局部的,常量遵循与变量相同的作用域规则。

一个常量不可以被重新赋值,并且不能被重复声明.所以,虽然可以在声明一个常量的时候不进行初始化,但这样做是没有意义的,因为这个常量的值永远会保持undefined。

一个常量不能和它所在作用域内的其他变量或函数拥有相同的名称。

示例
下面的例子演示了常量的行为。

const num = 10;
num =20;
console.log(num); // 10

如果我们在上面声明常量num,在声明var num,这时会报错,num已经声明。

const num = 10;
var num = 20;
console.log(num); // 'num' has already been declared

块级作用域

很多语言中都有块级作用域,JavaScript使用var声明变量,以function来划分作用域,大括号“{}” 却限定不了var的作用域。用var声明的变量具有变量提升(declaration hoisting)的效果。

ES6里增加了一个let,可以在{}, if, for里声明。用法同var,但作用域限定在块级,let声明的变量不存在变量提升。

'use strict';
function f1() {
var a = 1;
let n = 2;
if (true) {var a = 20;let n = 10;
}
console.log(n); // 2
console.log(a); // 20
}
f1();

类声明和类表达式

ES6 中的类实际上就是个函数,而且正如函数的定义方式有函数声明和函数表达式两种一样,类的定义方式也有两种,分别是:类声明、类表达式。

类声明

  类声明是定义类的一种方式,就像下面这样,使用 class 关键字后跟一个类名(这里是 Ploygon),就可以定义一个类。

'use strict';
class Polygon {constructor(height, width) {this.height = height;this.width = width;}
}

变量提升

  类声明和函数声明不同的一点是,函数声明存在变量提升现象,而类声明不会。也就是说,你必须先声明类,然后才能使用它,否则代码会抛出 ——ReferenceError 异常,像下面这样:

var p = new Polygon(); // ReferenceErrorclass Polygon {}

类表达式

类表达式是定义类的另外一种方式,就像函数表达式一样,在类表达式中,类名是可有可无的。如果定义了类名,则该类名只有在类体内部才能访问到。

'use strict';
// 匿名类表达式
var Polygon = class {constructor(height, width) {this.height = height;this.width = width;}
};
// 命名类表达式
var Polygon = class Polygon {constructor(height, width) {this.height = height;this.width = width;}
};

构造函数

类的成员需要定义在一对花括号 {} 里,花括号里的代码和花括号本身组成了类体。类成员包括类构造器和类方法(包括静态方法和实例方法)。

class 根据 constructor 方法来创建和初始化对象。

constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类只能有一个constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。

constructor() {}
constructor方法默认返回实例对象(即this),完全可以指定返回另外一个对象。

'use strict';
class Foo {constructor() {   return Object.create(null);}
}
new Foo() instanceof Foo
// false

上面代码中,constructor函数返回一个全新的对象,结果导致实例对象不是Foo类的实例。

constructor 方法是一个特殊的类方法,它既不是静态方法也不是实例方法,它仅在实例化一个类的时候被调用。一个类只能拥有一个名为 constructor 的方法,否则会抛出 SyntaxError 异常。

严格模式

类和模块的内部,默认就是严格模式,所以不需要使用use strict指定运行模式。只要你的代码写在类或模块之中,就只有严格模式可用。

静态方法

static关键字定义了一个类的静态方法。静态方法被称为无需实例化类也可当类被实例化。静态方法通常用于为应用程序创建实用函数。

示例

'use strict';
class Point {constructor(x, y) {this.x = x;this.y = y;}static distance(a, b) {const dx = a.x - b.x;const dy = a.y - b.y;return Math.sqrt(dx*dx + dy*dy);}
}const p1 = new Point(5, 5);
const p2 = new Point(10, 10);console.log(Point.distance(p1, p2));

使用 extends 关键字创建子类

extends 关键字可以用来创建继承于某个类的子类。

这个例子是根据名为Animal类创建一个名为Dog的类。

'use strict';
class Animal { constructor(name) {this.name = name;}speak() {console.log(this.name + ' makes a noise.');}
}class Dog extends Animal {speak() {console.log(this.name + ' barks.');}
}
var dog = new Dog('NiNi');
dog.speak();

Nodejs 4.0 ES6特性相关推荐

  1. Nodejs下的ES6兼容性与性能分析

    2019独角兽企业重金招聘Python工程师标准>>> ES6标准发布后,前端人员也开发渐渐了解到了es6,但是由于兼容性的问题,仍然没有得到广泛的推广,不过业界也用了一些折中性的方 ...

  2. 一些当前 Node.js 中最流行 ES6 特性的 benchmark (V8 / Chakra)

    前言 项目 github 地址:https://github.com/DavidCai1993/ES6-benchmark 如果有想要增加的特性 benchmark ,欢迎更新benchmarks/ ...

  3. 最常用的ES6特性(转)

    最常用的ES6特性 let, const, class, extends, super, arrow functions, template string, destructuring, defaul ...

  4. 第四节:教你如何快速让浏览器兼容ES6特性

    写在正文前,本来这一节的内容应该放在第二节更合适,因为当时就有同学问ES6的兼容性如何,如何在浏览器兼容ES6的特性,这节前端君会介绍一个抱砖引玉的操作案例. 为什么ES6会有兼容性问题? 由于广大用 ...

  5. 9个超级实用的 ES6 特性,超级实用哦!

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

  6. 智能语音应用开发之DPL2.0高级特性

    自从智能屏上市以来,智能语音交互演化成了多模态智能交互,智能语音应用的开发与Web 开发越来越类似,开发者基于DuerOS研发智能语音技能的成本也相应地逐渐降低了.如果把基于模版的技能开发看作是静态的 ...

  7. JDK5.0新特性系列---目录

    JDK5.0新特性系列---目录 JDK5.0新特性系列---1.自动装箱和拆箱 JDK5.0新特性系列---2.新的for循环 JDK5.0新特性系列---3.枚举类型 JDK5.0新特性系列--- ...

  8. [转]C# 2.0新特性与C# 3.5新特性

    C# 2.0新特性与C# 3.5新特性 一.C# 2.0 新特性: 1.泛型List<MyObject> obj_list=new List(); obj_list.Add(new MyO ...

  9. Servlet 3.0 新特性概述

    Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若 ...

最新文章

  1. 麦克风阵列降噪_黄鹂智声降噪耳机E100u,与喧嚣说再见
  2. iOS 11开发教程(十八)iOS11应用视图之使用代码添加按钮
  3. linux中将文本中的单词换掉的指令_从零开始学Linux运维|19.文本处理相关命令(2)...
  4. Java 条件解析,Java Lambda使用条件检查解析集合
  5. 错误提示“未能加载文件或程序集“Microsoft.Office.Interop.Owc11”,
  6. php webshell开源,[github开源]webshell连接器--Jeshell
  7. nodejs,express链式反应
  8. 系统间数据传输,产品经理视角的9千字总结:接口、otter、log4j、SFTP、MQ……...
  9. 数据库startup报错_SQL Server数据库恢复过程内部–数据库STARTUP命令
  10. 实验板FPGA型号在哪里看_项目分享| 自制FPGA最小系统板(PCB可直接打板)
  11. Python数据分析与机器学习项目实战
  12. 基于R的飞机航线数据可视化(行政区划)
  13. IDEA中使用UT测试过程中的一些小问题
  14. 电子邮箱邮件怎么撤回,邮箱如何撤回邮件?
  15. java poi 导入报错,Cannot get a NUMERIC value from a STRING cell
  16. iphone各个系列手机最新的尺寸资料(更新到iphone6s)
  17. qt无法显示图片的原因
  18. 本田思域自动挡挡位图解,思域换挡操作技巧
  19. Scrum立会报告+燃尽图(Final阶段第七次)
  20. linux之bc命令使用详解_Linux命令bc使用详解

热门文章

  1. springboot初始篇(一)
  2. The Breakpoint will not currently be hit. No executable code associated with this line
  3. js中将时间字符串转换为时间戳
  4. iis10 HTTP 错误 500.19 - Internal Server Error
  5. Java学习笔记(基本数据类型和变量命名规则)
  6. ruby的optparse使用小记
  7. BZOJ 3357: [Usaco2004]等差数列( dp )
  8. 计算机系统中CPU的寄存器介绍
  9. Entity Framework5.0运行时错误ObjectStateManager 中已存在具有同一键的对象
  10. 关于maven依赖中的scope的作用和用法