新一代的javascript也被稱爲ECMAScript 6(也稱爲 ES6 or Harmony)給我們帶來很多令人意想不到的功能,在這裏我們花費幾分鐘來學習一下其中重要的功能。
糖語法
首先,語法糖是一種語法,使得語言更容易理解和更具有可讀性,它使語言相對我們來說變得更"甜"。這也意味着ES6的一些"新"的特點並不是真的新,只是試圖簡化語法而已,讓我們編程更容易。這樣就無需使用老式的取巧的方法編寫你的代碼,而是可以一種更簡單的方式來編寫代碼,那就是使用糖語法。
javascript並不像其他面嚮對象語言一樣支持類這個概念,相反js使用function和prototype模擬類的概念。
下面是創建類的新語法,如果你有來自Java或其他OO語言的背景你會很熟悉:
class Project {
constructor(name) {
this.name = name;
}
start() {
return "Project " + this.name + " starting";
}
}
var project = new Project("Journal");
project.start(); // "Project Journal starting"
你在這個類中定義的所有方法都被加入這個類的原型prototype中。
既然JS不支持類,那麼它支持繼承嗎?
是的,JS中繼承是通過prototype實現。下面是WebProject子類繼承Project類的代碼:
class WebProject extends Project {
constructor(name, technologies) {
super(name);
this.technologies = technologies;
}
info() {
return this.name + " uses " + arrayToString(this.technology);
}
}
function arrayToString(param) {
// ... some implementation
}
var webJournal = new WebProject("FrontEnd Journal", "javascript");
webJournal.start(); // "FrontEnd Journal starting"
webJournal.info(); // "FrontEnd Journal uses javascript"
注意到在WebProject 構造器中,調用了Project的構造器,這樣可以使用它的屬性和方法。
模塊Module
如果你想將所有js放在一個文件中,或者你要在應用的不同地方使用相同的功能,你就要使用模塊,記住魔術的關鍵詞是export,在你的函數之前使用export。
假設Project 和 WebProject 都儲存在application.js文件中,如下源碼結構:
myproject (folder)
|
-- modules (folder)
| |
| -- helpers.js
|
-- application.js
如果我們從application.js中分離arrayToString(),然後放入modules/helpers.js,這樣我們在其他地方可以重用它:
// modules/helper.js
export function arrayToString(param) {
// some implementation
}
這樣我們只需要導入我們的模塊即可:
// application.js
import { arrayToString } from 'modules/helpers';
class WebProject extends Project {
constructor(name, technologies) {
super(name);
this.technologies = technology;
}
info() {
return this.name + " uses " + arrayToString(this.technology);
}
}
// ...
let和const
ES6中有兩個新特性:let和 const,爲了理解let,我們需要記住var是創建函數生存期內的變量:
function printName() {
if(true) {
var name = "Rafael";
}
console.log(name); // Rafael
}
不像Java或其他語言,任何變量在JS中是在一個函數內創建,它會升級到哦函數之外部,不管你在哪裏定義變量,都和你在函數頂部定義一樣,這個行爲稱爲hoisting。
上面代碼用下面方式容易理解些:
function printName() {
var name; // variable declaration is hoisted to the top
if(true) {
name = "Rafael";
}
console.log(name); // Rafael
}
那麼let是如何工作呢,和hoisting有什麼關係,我們導入let的代碼如下:
function printName() {
if(true) {
let name = "Rafael";
}
console.log(name); // ReferenceError: name is not defined
}
let是在一個代碼塊內,變量名只能在代碼塊中可見。
function printName() {
var name = "Hey";
if(true) {
let name = "Rafael";
console.log(name); // Rafael
}
console.log(name); // Hey
}
總結:var是function-scoped,而let是 block-scoped.
const是創建常量使用,一旦創建就一直不會被概念,如下:
const SERVER_URL = "http://www.jdon.com"
ES6還有其他新功能:Map, WeakMap, generators 和Proxies
那麼什麼時候可以使用ES6這些特性呢?可見下面這個網址:
http://kangax.github.com/es5-compat-table/es6/
Node.JS的ES6特性可見:ES6 for Node
[轉自www.jdon.com的js語言學習教程