Node.js 是一個基於 Chrome V8 引擎的 JavaScript 運行環境。Node.js 使用了一個事件驅動、非阻塞式 I/O 的模型,使其輕量又高效。Node.js 的包管理器 npm,是全球最大的開源庫生態系統。npm
Node.js 4.0.0這個版本是Node和iojs合併後發佈的首個穩定版本,而且爲開發者帶來了大量的ES6語言擴展。瞭解 Node.js中包括的ES6語言擴展。本課將會爲你介紹如何使用這些新特性。promise
Node.js 4.0.0 可讓您享受最尖端的技術,保持項目的先進性。其中對 v8 的升級幾乎作到了與 Chromium / Google Chrome 同步,達到了 4.5.x,它提供了不少新的語言功能。ECMA-262 是 JavaScript 語言規範的最新版本,並且好多新特性數都是開箱即用的。這些新特性包括:異步
嚴格模式在語義上與正常的JavaScript有一些不一樣。 首先,嚴格模式會將JavaScript陷阱直接變成明顯的錯誤。其次,嚴格模式修正了一些引擎難以優化的錯誤:一樣的代碼有些時候嚴格模式會比非嚴格模式下更快。 第三,嚴格模式禁用了一些有可能在將來版本中定義的語法。ide
由於咱們ECMAScript 6中的一些特性,必須在嚴格模式下,纔可使用,而不報錯。函數
嚴格模式能夠應用到整個script標籤或某個別函數中。優化
爲整個script標籤開啓嚴格模式, 須要在全部語句以前放一個特定語句 "use strict"; (或 'use strict';)this
// 整個語句都開啓嚴格模式的語法 "use strict"; let v = "Hi! I'm a strict mode script!";
一樣的,要給某個函數開啓嚴格模式,得把 "use strict"; (或 'use strict'; )聲明一字不漏地放在函數體全部語句以前。code
function strict() { // 函數級別嚴格模式語法 'use strict'; return "Hi! I'm a strict mode function!" ; } function notStrict() { return "I'm not strict."; }
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這個聲明建立一個常量,能夠全局或局部的函數聲明。
一個常量能夠是全局的或者是局部的,常量遵循與變量相同的做用域規則。
一個常量不能夠被從新賦值,而且不能被重複聲明.因此,雖然能夠在聲明一個常量的時候不進行初始化,但這樣作是沒有意義的,由於這個常量的值永遠會保持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 關鍵字能夠用來建立繼承於某個類的子類。
這個例子是根據名爲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();