摘要:語法校驗會給出警告當你仍在使用或不通過任何關鍵字聲明變量時。但是如果腳本中還有其他的普通導出,就會得到非常奇怪的結果這個坑爹的情況目前還沒有任何好的解決方案。
我在多年前愛上了coffeScript。對于javaScript,我一直保持著深沉的愛,也十分高興得看到node.js的快速發展,但是作為一個有python背景的程序員,我更喜歡coffeeScript的簡練語法。
在任何一個活躍的社區中,事物的迭代更新都是必然的,現在,我們看見了javaScript向著ES6標準的巨大進步。ES6包含了相比于CoffeeScript更多好的特性,并且通過如Babel這樣的工具,我們已經可以開始著手使用他們。以下是從coffeeScript遷移到ES6的一些注意點和我的想法。
放棄空格(whitespace),重新轉而使用圓括號,花括號和分號。請接受在使用ES6時,你會敲上更多的符號。不過在規范的代碼格式下,它們看上去還是挺整潔的。
語法校驗過去我使用的是CoffeeLint,現在我通過babel-eslint來使用ESLint。遵循Airbnb ES6 style guide這個語法風格指南。最好將你的編輯器設置成在輸入或保存時進行語法檢查。Atom"s eslint plugin這個語法校驗插件非常不錯,你可以將上面的Airbnb ES6 style guide鏈接中的內容,放入你的.eslintrc配置文件中。SublimeText也有類似的插件。
代碼轉換(Transpiling)由于現在離對ES6的完美支持還很遠,所以最好還是使用代碼轉換器(Transpiling),如Babel,就像在用CoffeeScript時一樣。不過和CoffeeScript不同的是,這里有一些值得說明的:
1,并不是所有的ES6特性全部都可用,諸如Proxies。
2,另有一些ES6特性需要使用polyfill/runtime才可用,如Symbols,generator函數,WeakMap。一段package.json的例子:
json{ ... "scripts": { "lint": "eslint --ext .js,.es6 src", "precompile": "npm run lint", "compile": "babel --optional runtime src --out-dir lib", }, "dependencies": { "babel-runtime": "^5.3.3" }, "devDependencies": { "babel": "^5.3.3", ... } ... }
請不要將babel放入dependencies中,這樣會下載許多你并不需要的package,請將babel-runtime寫在dependencies中,將babel寫在devDependencies中。
3,一些CoffeeScript即有的特性如數組推導(list comprehensions)在ES6中也是不可用的,因為這些特性的規范還未被完全完善。
Let和Constvar已經過時了,現在流行的是它的好基友let和const。今后在javaScript中,如果要聲明不可變的變量,請使用const,反之,請使用let。
語法校驗會給出警告當你仍在使用var或不通過任何關鍵字聲明變量時。
有一個值得注意的點是,const僅僅是指向變量所在的地址,這可能需要花一點時間去適應:
jsconst name = "Daniel"; // This is a compile error name = "Kari"; // --------- const options = {}; const items = []; // This is *not* a compile error options.foo = "bar"; options.baz = 5; items.push(1); items.push(2); // This *is* a compile error options = {}; items = null;字符串替換
幸運的是,CoffeScript和ES6關于字符串替換方面區別很小,你要做的只是改變一下你的手指肌肉記憶:
jsconst name = "World"; console.log(`Hello, ${name}!`);
注意反引號代替了雙引號。
請確保你的編輯器能正確的高亮這些新語法,我敢保證在一開始你任然會時不時敲出#{name}。。
函數ES6中,有了一些新的函數類型,如generator函數和胖箭頭(=>)函數。胖箭頭函數在ES6和CoffeeScript中表現一致,如綁定函數中的上下文(this)為它被定義時的上下文。
函數的變參也同樣被支持,但是與coffeeScript語法不同的是,ES6中省略號在另外一側。參數默認值和解構賦值也同樣被支持。
coffeeScript:
Coffeesquare = (value) -> value * value someTask (err, result) => # Handle err and result myFunc = ({source, flag}, args...) -> otherFunc source, args...
javaScript:
jsconst square = value => value * value; someTask((err, result) => { // Handle err and result }); function myFunc({source, flag}, ...args) { return otherFunc(source, ...args); }generator函數:
generator函數提供了一種迭代一系列超長任務的便捷方式,例子:
js// Instead of creating a 10000 item array, we yield each item as // needed. function *squares() { for (let n = 0; n < 10000; n++) { yield n * n; } } for (let square of squares()) { console.log(square); }
通過function*語法來聲明一個generator函數。這與CoffeScript中只要函數體內包含yield關鍵字,本函數就是generator函數不同。generator函數同樣也可以yield和返回值。
類(Classes)兩者關于類的語法非常的相似,不過在ES6中,只可以在class中聲明函數。下面的例子說明了兩者語法的接近,包括繼承:
coffeeScript:
Coffeeclass Account extends Foo @types = ["checking", "savings"] constructor: (@balance) -> history: (done) -> someLongTask (err, data) -> # Do something with data done null, data deposit: (amount) -> @balance += amount
javaScript:
jsclass Account extends Foo { constructor(balance) { this.balance = balance; } history(done) { someLongTask((err, data) => { // Do something with data done(null, data); }); } deposit(amount) { this.balance += amount; return this.balance; } } // Currently, you can only declare functions in a class Account.types = ["checking", "savings"];
一個不錯的特性是類有了定義getter和setter的能力,不過它們不能是generator函數:
jsclass Account { constructor() { this.balance = 0; } get underBudget() { return this.balance >= 0; } get overBudget() { return this.balance < 0; } } const myAccount = Account(); myAccount.balance = 100; console.log(myAccount.underBudget); // => true可遍歷類(Iterable Classes)
另一個靈活的特性就是可以創建可遍歷類,并且可以將generator函數用于遍歷器。
jsclass MyIterable { constructor(items) { this.items = items; } *[Symbol.iterator]() { for (let item of this.items) { yield `Hello, ${item}`; } } } const test = new MyIterable([1, 2, 3, 4, 5]); for (let item of test) { console.log(item); // => Hello, 1... }模塊
ES6提供了一個新的模塊語法,這也需要花一定時間適應,因為它同時提供了匿名導出和普通導出:
jsimport _ from "lodash"; import {item1, item2} from "./mylib"; import * as library from "library"; //普通導出 export const name = "Daniel"; export function abc() { return 1; } export class Toaster { // ... } //匿名導出 export default function() { return new Toaster(); }
幾個值得注意的點:
1,如果不使用匿名導出,你不能直接通過import moduleName from "moduleName";來獲取所有的導出對象,而是要使用import * as moduleName from "moduleName";:
js// mymodule.js // ----------- export function yes() { return true; } // script-broken.js // ---------------- import mymodule from "./mymodule"; // This gives an error about `undefined`! console.log(mymodule.yes()); // script-working.js // ----------------- import * as mymodule from "./mymodule"; console.log(mymodule.yes());
2,如果腳本中僅僅只有一個匿名導出,那么在使用Node.js的require命令引入時,這個匿名導出的對象表現得像被傳遞給了module.exports一樣。但是如果腳本中還有其他的普通導出,就會得到非常奇怪的結果:
js// mymodule.js // ----------- export function yes() { return true; } function no() { return false; } export default {yes, no}; // script-working.js // ----------------- import mymodule, {yes} from "./mymodule"; console.log(mymodule.no()); console.log(yes()); // script-broken.js // ---------------- const mymodule = require("./mymodule"); // Wat? This is an error. console.log(mymodule.no()); // This works instead. Turns out the module is an object with a "default" // key that contains the default export. console.log(mymodule.default.no());
這個坑爹的情況目前還沒有任何好的解決方案。所以如果你正在寫一個庫并且準備讓Node.js使用者使用require命令對其進行導入,最好只使用一次匿名導出,并且把一切的一切都綁定在這個匿名導出的對象的屬性上。
結語希望本文可以幫助到一些準備從coffeeScript遷移到ES6的人,我本人也在學習ES6的過程中感受到十足的樂趣,并且我對我的新玩具ESLint和Babel實在是愛不釋手。。
原文鏈接
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/91507.html
摘要:以下例子的目的是使用來展示一個每秒都會更新的時鐘當嘗試在的回調中使用來引用元素時,很不幸,我們得到的只是一個屬于回調函數自身上下文的。 前言 胖箭頭函數(Fat arrow functions),又稱箭頭函數,是一個來自ECMAScript 2015(又稱ES6)的全新特性。有傳聞說,箭頭函數的語法=>,是受到了CoffeeScript 的影響,并且它與CoffeeScript中的=>...
摘要:在年成為最大贏家,贏得了實現的風暴之戰。和他的競爭者位列第二沒有前端開發者可以忽視和它的生態系統。他的殺手級特性是探測功能,通過檢查任何用戶的功能,以直觀的方式讓開發人員檢查所有端點。 2016 JavaScript 后起之秀 本文轉載自:眾成翻譯譯者:zxhycxq鏈接:http://www.zcfy.cc/article/2410原文:https://risingstars2016...
摘要:他們的計劃是,使用微軟開發者們所習慣的其他語言的開發工具所支持的靜態類型,得到更好的代碼。在微軟內部,被和以及團隊所使用,而且它被系的等公司使用。標準的編輯,同時也是微軟項目高級經理的也同意。 本文轉載自:眾成翻譯譯者:文藺鏈接:http://www.zcfy.cc/article/895原文:http://thenewstack.io/javascript-transpilers-n...
摘要:好久沒有更新系列文章了,今天去官網一看也出來了。也在以下幾處實現上進行了改進改進了與第三方庫的協同工作能力。移除了這個作用是在中用來作為。使用了更加簡單方便的方式來處理和第三方庫的關系。這次升級的主要目標之一就是數據系統的改進。 好久沒有更新polymer系列文章了,今天去官網一看2.0 preview也出來了。這幾天項目正好不緊,有大量的空閑時間,不如就翻譯一下這篇關于Polymer...
摘要:在,是當之無愧的王者,贏得了與之間的戰爭,攻陷了的城池。于月發布了版本,這一版本為了更好的表現加入了渲染方式。前端框架這個前端框架清單可能是年疲勞的元兇之一。的創建者,目前在工作為尋找構建簡單性和自主配置性之間的平衡做了很大的貢獻。 春節后的第一篇就從這個開始吧~本文已在前端早讀課公眾號上首發 原文鏈接 JavasScript社區在創新的道路上開足了馬力,曾經流行過的也許一個月之后就過...
閱讀 910·2021-09-22 15:17
閱讀 1943·2021-09-22 15:06
閱讀 2228·2021-09-08 09:35
閱讀 5115·2021-09-01 11:43
閱讀 3487·2019-08-30 15:55
閱讀 2161·2019-08-30 12:48
閱讀 3160·2019-08-30 12:45
閱讀 1791·2019-08-29 17:31