Node.js 4.0的ES6新特性

简介

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(); // ReferenceError

class 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();

转自:https://cnodejs.org/topic/56302801fa186b6f4496b53b
时间: 2024-08-10 23:30:35

Node.js 4.0的ES6新特性的相关文章

JS魔法堂:ES6新特性——GeneratorFunction介绍

一.前言       第一次看koajs的示例时,发现该语句 function *(next){...............} ,这是啥啊?于是搜索一下,原来这是就是ES6的新特性Generator Function(生成器函数). 那什么是生成器函数呢?其实就相当于C#2.0中通过yield关键字实现的迭代器生成器(细节有所不同),那么理解的关键就在yield关键字了.下面将尝试从表象出发,逐步对生成器函数及利用它进行异步编程进行浅层的分析理解. 二.语法及基本使用   示例: // 定义生

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

JS 开发者必须知道的十个 ES6 新特性 这是为忙碌的开发者准备的ES6中最棒的十个特性(无特定顺序): 默认参数 模版表达式 多行字符串 拆包表达式 改进的对象表达式 箭头函数 =&> Promise 块级作用域的let和const 类 模块化 注意:这个列表十分主观并且带有偏见,其他未上榜的特性并不是因为没有作用,我这么做只是单纯的希望将这份列表中的项目保持在十个. 首先,一个简单的JavaScript时间线,不了解历史的人也无法创造历史. 1995年:JavaScript以LiveS

JS篇 ES6新特性

注意: 1. Node环境下,--harmony参数启用ES6新特性,许多新特性只有在strict mode下才生效,因此使用"use strict"或者--use_strict,否则harmony没有被启用: 1. 块级作用域(Block scope) // Block scope function f1(){ console.log("Outside."); } (function(){ if(false){ // f1定义在if {}之内 function f

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

ES6新特性概览 本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony(和谐之意,显然没有跟上我国的步伐,我们已经进入中国梦版本了).上一次标准的制订还是2009年出台的ES5.目前ES6的标准化工作正在进行中,预计会在14年12月份放出正式敲定的版本.但大部分标准已经就绪,且各浏览器对ES6的支持也正在实现中.要查看ES6的支持情况请点此. 目前想要

JavaScript学习--Item24 ES6新特性概览

ES6新特性概览 本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony(和谐之意,显然没有跟上我国的步伐,我们已经进入中国梦版本了).上一次标准的制订还是2009年出台的ES5.目前ES6的标准化工作正在进行中,预计会在14年12月份放出正式敲定的版本.但大部分标准已经就绪,且各浏览器对ES6的支持也正在实现中.要查看ES6的支持情况请点此. 目前想要

ES6新特性

ES6新特性概览 箭头操作符 如果你会C#或者Java,你肯定知道lambda表达式,ES6中新增的箭头操作符=>便有异曲同工之妙.它简化了函数的书写.操作符左边为输入的参数,而右边则是进行的操作以及返回的值Inputs=>outputs. 我们知道在JS中回调是经常的事,而一般回调又以匿名函数的形式出现,每次都需要写一个function,甚是繁琐.当引入箭头操作符后可以方便地写回调了.请看下面的例子. var array = [1, 2, 3]; //传统写法 array.forEach(f

ES6新特性:Proxy代理器

ES6新特性:Proxy: 要使用的话, 直接在浏览器中执行即可, node和babel目前还没有Proxy的polyfill;,要使用的话,直接在浏览器中运行就好了, 浏览器的兼容性为:chrome>39或者firefox>18: Proxy的基本使用: Proxy如其名, 它的作用是在对象和和对象的属性值之间设置一个代理,获取该对象的值或者设置该对象的值, 以及实例化等等多种操作, 都会被拦截住, 经过这一层我们可以统一处理,我们可以认为它就是“代理器” ; Proxy是一个构造函数, 使

在 Ubuntu 14.04/15.04 上配置 Node JS v4.0.0

大家好,Node.JS 4.0 发布了,这个流行的服务器端 JS 平台合并了 Node.js 和 io.js 的代码,4.0 版就是这两个项目结合的产物——现在合并为一个代码库.这次最主要的变化是 Node.js 封装了4.5 版本的 Google V8 JS 引擎,与当前的 Chrome 所带的一致.所以,紧跟 V8 的发布可以让 Node.js 运行的更快.更安全,同时更好的利用 ES6 的很多语言特性. Node.js 4.0 发布的主要目标是为 io.js 用户提供一个简单的升级途径,所

ES6新特性概览

转自:http://www.cnblogs.com/Wayou/p/es6_new_features.html ES6学习可参考:http://es6.ruanyifeng.com/ 本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony(和谐之意,显然没有跟上我国的步伐,我们已经进入中国梦版本了).上一次标准的制订还是2009年出台的ES5.目前ES6