摘要:語法校驗會給出警告當(dāng)你仍在使用或不通過任何關(guān)鍵字聲明變量時。但是如果腳本中還有其他的普通導(dǎo)出,就會得到非常奇怪的結(jié)果這個坑爹的情況目前還沒有任何好的解決方案。
我在多年前愛上了coffeScript。對于javaScript,我一直保持著深沉的愛,也十分高興得看到node.js的快速發(fā)展,但是作為一個有python背景的程序員,我更喜歡coffeeScript的簡練語法。
在任何一個活躍的社區(qū)中,事物的迭代更新都是必然的,現(xiàn)在,我們看見了javaScript向著ES6標(biāo)準(zhǔn)的巨大進(jìn)步。ES6包含了相比于CoffeeScript更多好的特性,并且通過如Babel這樣的工具,我們已經(jīng)可以開始著手使用他們。以下是從coffeeScript遷移到ES6的一些注意點(diǎn)和我的想法。
放棄空格(whitespace),重新轉(zhuǎn)而使用圓括號,花括號和分號。請接受在使用ES6時,你會敲上更多的符號。不過在規(guī)范的代碼格式下,它們看上去還是挺整潔的。
語法校驗過去我使用的是CoffeeLint,現(xiàn)在我通過babel-eslint來使用ESLint。遵循Airbnb ES6 style guide這個語法風(fēng)格指南。最好將你的編輯器設(shè)置成在輸入或保存時進(jìn)行語法檢查。Atom"s eslint plugin這個語法校驗插件非常不錯,你可以將上面的Airbnb ES6 style guide鏈接中的內(nèi)容,放入你的.eslintrc配置文件中。SublimeText也有類似的插件。
代碼轉(zhuǎn)換(Transpiling)由于現(xiàn)在離對ES6的完美支持還很遠(yuǎn),所以最好還是使用代碼轉(zhuǎn)換器(Transpiling),如Babel,就像在用CoffeeScript時一樣。不過和CoffeeScript不同的是,這里有一些值得說明的:
1,并不是所有的ES6特性全部都可用,諸如Proxies。
2,另有一些ES6特性需要使用polyfill/runtime才可用,如Symbols,generator函數(shù),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即有的特性如數(shù)組推導(dǎo)(list comprehensions)在ES6中也是不可用的,因為這些特性的規(guī)范還未被完全完善。
Let和Constvar已經(jīng)過時了,現(xiàn)在流行的是它的好基友let和const。今后在javaScript中,如果要聲明不可變的變量,請使用const,反之,請使用let。
語法校驗會給出警告當(dāng)你仍在使用var或不通過任何關(guān)鍵字聲明變量時。
有一個值得注意的點(diǎn)是,const僅僅是指向變量所在的地址,這可能需要花一點(diǎn)時間去適應(yīng):
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;字符串替換
幸運(yùn)的是,CoffeScript和ES6關(guān)于字符串替換方面區(qū)別很小,你要做的只是改變一下你的手指肌肉記憶:
jsconst name = "World"; console.log(`Hello, ${name}!`);
注意反引號代替了雙引號。
請確保你的編輯器能正確的高亮這些新語法,我敢保證在一開始你任然會時不時敲出#{name}。。
函數(shù)ES6中,有了一些新的函數(shù)類型,如generator函數(shù)和胖箭頭(=>)函數(shù)。胖箭頭函數(shù)在ES6和CoffeeScript中表現(xiàn)一致,如綁定函數(shù)中的上下文(this)為它被定義時的上下文。
函數(shù)的變參也同樣被支持,但是與coffeeScript語法不同的是,ES6中省略號在另外一側(cè)。參數(shù)默認(rèn)值和解構(gòu)賦值也同樣被支持。
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函數(shù):
generator函數(shù)提供了一種迭代一系列超長任務(wù)的便捷方式,例子:
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函數(shù)。這與CoffeScript中只要函數(shù)體內(nèi)包含yield關(guān)鍵字,本函數(shù)就是generator函數(shù)不同。generator函數(shù)同樣也可以yield和返回值。
類(Classes)兩者關(guān)于類的語法非常的相似,不過在ES6中,只可以在class中聲明函數(shù)。下面的例子說明了兩者語法的接近,包括繼承:
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函數(shù):
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)
另一個靈活的特性就是可以創(chuàng)建可遍歷類,并且可以將generator函數(shù)用于遍歷器。
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提供了一個新的模塊語法,這也需要花一定時間適應(yīng),因為它同時提供了匿名導(dǎo)出和普通導(dǎo)出:
jsimport _ from "lodash"; import {item1, item2} from "./mylib"; import * as library from "library"; //普通導(dǎo)出 export const name = "Daniel"; export function abc() { return 1; } export class Toaster { // ... } //匿名導(dǎo)出 export default function() { return new Toaster(); }
幾個值得注意的點(diǎn):
1,如果不使用匿名導(dǎo)出,你不能直接通過import moduleName from "moduleName";來獲取所有的導(dǎo)出對象,而是要使用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,如果腳本中僅僅只有一個匿名導(dǎo)出,那么在使用Node.js的require命令引入時,這個匿名導(dǎo)出的對象表現(xiàn)得像被傳遞給了module.exports一樣。但是如果腳本中還有其他的普通導(dǎo)出,就會得到非常奇怪的結(jié)果:
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());
這個坑爹的情況目前還沒有任何好的解決方案。所以如果你正在寫一個庫并且準(zhǔn)備讓Node.js使用者使用require命令對其進(jìn)行導(dǎo)入,最好只使用一次匿名導(dǎo)出,并且把一切的一切都綁定在這個匿名導(dǎo)出的對象的屬性上。
結(jié)語希望本文可以幫助到一些準(zhǔn)備從coffeeScript遷移到ES6的人,我本人也在學(xué)習(xí)ES6的過程中感受到十足的樂趣,并且我對我的新玩具ESLint和Babel實(shí)在是愛不釋手。。
原文鏈接
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/91507.html
摘要:以下例子的目的是使用來展示一個每秒都會更新的時鐘當(dāng)嘗試在的回調(diào)中使用來引用元素時,很不幸,我們得到的只是一個屬于回調(diào)函數(shù)自身上下文的。 前言 胖箭頭函數(shù)(Fat arrow functions),又稱箭頭函數(shù),是一個來自ECMAScript 2015(又稱ES6)的全新特性。有傳聞?wù)f,箭頭函數(shù)的語法=>,是受到了CoffeeScript 的影響,并且它與CoffeeScript中的=>...
摘要:在年成為最大贏家,贏得了實(shí)現(xiàn)的風(fēng)暴之戰(zhàn)。和他的競爭者位列第二沒有前端開發(fā)者可以忽視和它的生態(tài)系統(tǒng)。他的殺手級特性是探測功能,通過檢查任何用戶的功能,以直觀的方式讓開發(fā)人員檢查所有端點(diǎn)。 2016 JavaScript 后起之秀 本文轉(zhuǎn)載自:眾成翻譯譯者:zxhycxq鏈接:http://www.zcfy.cc/article/2410原文:https://risingstars2016...
摘要:他們的計劃是,使用微軟開發(fā)者們所習(xí)慣的其他語言的開發(fā)工具所支持的靜態(tài)類型,得到更好的代碼。在微軟內(nèi)部,被和以及團(tuán)隊所使用,而且它被系的等公司使用。標(biāo)準(zhǔn)的編輯,同時也是微軟項目高級經(jīng)理的也同意。 本文轉(zhuǎn)載自:眾成翻譯譯者:文藺鏈接:http://www.zcfy.cc/article/895原文:http://thenewstack.io/javascript-transpilers-n...
摘要:好久沒有更新系列文章了,今天去官網(wǎng)一看也出來了。也在以下幾處實(shí)現(xiàn)上進(jìn)行了改進(jìn)改進(jìn)了與第三方庫的協(xié)同工作能力。移除了這個作用是在中用來作為。使用了更加簡單方便的方式來處理和第三方庫的關(guān)系。這次升級的主要目標(biāo)之一就是數(shù)據(jù)系統(tǒng)的改進(jìn)。 好久沒有更新polymer系列文章了,今天去官網(wǎng)一看2.0 preview也出來了。這幾天項目正好不緊,有大量的空閑時間,不如就翻譯一下這篇關(guān)于Polymer...
摘要:在,是當(dāng)之無愧的王者,贏得了與之間的戰(zhàn)爭,攻陷了的城池。于月發(fā)布了版本,這一版本為了更好的表現(xiàn)加入了渲染方式。前端框架這個前端框架清單可能是年疲勞的元兇之一。的創(chuàng)建者,目前在工作為尋找構(gòu)建簡單性和自主配置性之間的平衡做了很大的貢獻(xiàn)。 春節(jié)后的第一篇就從這個開始吧~本文已在前端早讀課公眾號上首發(fā) 原文鏈接 JavasScript社區(qū)在創(chuàng)新的道路上開足了馬力,曾經(jīng)流行過的也許一個月之后就過...
閱讀 888·2021-09-22 15:17
閱讀 1917·2021-09-22 15:06
閱讀 2211·2021-09-08 09:35
閱讀 5099·2021-09-01 11:43
閱讀 3475·2019-08-30 15:55
閱讀 2150·2019-08-30 12:48
閱讀 3149·2019-08-30 12:45
閱讀 1782·2019-08-29 17:31