国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[譯] 從 CoffeeScript 遷移到 ES6

劉東 / 1962人閱讀

摘要:語法校驗會給出警告當(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和Const

var已經(jīng)過時了,現(xiàn)在流行的是它的好基友letconst。今后在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"];

一個不錯的特性是類有了定義gettersetter的能力,不過它們不能是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

相關(guān)文章

  • []JavaScript ES6箭頭函數(shù)指南

    摘要:以下例子的目的是使用來展示一個每秒都會更新的時鐘當(dāng)嘗試在的回調(diào)中使用來引用元素時,很不幸,我們得到的只是一個屬于回調(diào)函數(shù)自身上下文的。 前言 胖箭頭函數(shù)(Fat arrow functions),又稱箭頭函數(shù),是一個來自ECMAScript 2015(又稱ES6)的全新特性。有傳聞?wù)f,箭頭函數(shù)的語法=>,是受到了CoffeeScript 的影響,并且它與CoffeeScript中的=>...

    makeFoxPlay 評論0 收藏0
  • ( & 轉(zhuǎn)載) 2016 JavaScript 后起之秀

    摘要:在年成為最大贏家,贏得了實(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...

    darry 評論0 收藏0
  • 】關(guān)于轉(zhuǎn)器 JavaScript 程序員需要知道的

    摘要:他們的計劃是,使用微軟開發(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...

    freecode 評論0 收藏0
  • []關(guān)于Polymer 2.0

    摘要:好久沒有更新系列文章了,今天去官網(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...

    lixiang 評論0 收藏0
  • 2016-JavaScript之星

    摘要:在,是當(dāng)之無愧的王者,贏得了與之間的戰(zhàn)爭,攻陷了的城池。于月發(fā)布了版本,這一版本為了更好的表現(xiàn)加入了渲染方式。前端框架這個前端框架清單可能是年疲勞的元兇之一。的創(chuàng)建者,目前在工作為尋找構(gòu)建簡單性和自主配置性之間的平衡做了很大的貢獻(xiàn)。 春節(jié)后的第一篇就從這個開始吧~本文已在前端早讀課公眾號上首發(fā) 原文鏈接 JavasScript社區(qū)在創(chuàng)新的道路上開足了馬力,曾經(jīng)流行過的也許一個月之后就過...

    Binguner 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<