摘要:一般來說,可以縮短大約的代碼長(zhǎng)度。這就避免了意外創(chuàng)建全局變量。使用表示,不推薦的和將不能使用。因此,使用將是有效的解決方法之一。
簡(jiǎn)單易懂的介紹
CoffeeScript是什么?
首先,它是一門小巧的編程語(yǔ)言。有一本關(guān)于CoffeeScript的指南,寫作“The Little Book on CoffeeScript”:
很小,是嗎?
然后,它是一門JavaScript的轉(zhuǎn)譯語(yǔ)言。這個(gè)轉(zhuǎn)譯過程看起來像這樣:
.coffee的文件將會(huì)被編譯為.js的文件,然后,就像使用JavaScript那樣使用它!
在[coffeescript.org][]上有這樣一句話:
The golden rule of CoffeeScript is: "It"s just JavaScript".
也就是說,良好的面對(duì)CoffeeScript的心態(tài)是,“它只是JavaScript”!
更少代碼CoffeeScript可以讓你少寫一點(diǎn)代碼。請(qǐng)看下圖:
可見,CoffeeScript精簡(jiǎn)了JavaScript的{}、()、;等符號(hào)的使用,并為function、this等關(guān)鍵字定義了簡(jiǎn)單的符號(hào)表示法。這些風(fēng)格轉(zhuǎn)換都使得CoffeeScript代碼量更少。
一般來說,CoffeeScript可以縮短大約1 / 3的代碼長(zhǎng)度。
語(yǔ)言特性增強(qiáng)CoffeeScript較JavaScript在語(yǔ)言特性上進(jìn)行了改善。在CoffeeScript中,所有的變量聲明都不再使用var關(guān)鍵字:
number = 1.0
CoffeeScript在編譯時(shí)會(huì)自動(dòng)分析上面這樣的語(yǔ)句,如果被賦值的變量未被定義,會(huì)在作用域頂部用var定義變量(由.coffee編譯得到的.js)。這就避免了意外創(chuàng)建全局變量。如果要在CoffeeScript中聲明全局變量,必須用顯式的代碼定義:
window.paintSize = 10
CoffeeScript為字符串拼接提供了更方便的寫法,例如:
drawTitle = "Start from #{number}."
其中number會(huì)取作用域中的對(duì)應(yīng)變量。
CoffeeScript使用is表示===,不推薦的==和!=將不能使用。例如:
"draw" if 1 is true
其他的語(yǔ)義化的轉(zhuǎn)化:
CoffeeScript默認(rèn)將最后一條語(yǔ)句作為返回值(受啟發(fā)于Ruby),例如:
description = -> console.log "Thinking." @
將等同于:
description = function() { console.log("Thinking."); return this; };可能有用的一些說明 隱式括號(hào)
在CoffeeScript中,允許用空格的形式來表示括號(hào),這稱為隱式括號(hào)。但是,隱式括號(hào)使用不當(dāng)會(huì)帶來一些問題,例如:
console.log Math.floor 1.7, Math.ceil 1.7
編譯為.js將是:
console.log(Math.floor(1.7, Math.ceil(1.7)));
這可能不是你想要的結(jié)果。關(guān)于隱式括號(hào)需要理解的一點(diǎn)是:直到表達(dá)式末尾,隱式括號(hào)才會(huì)閉合。所以,建議的寫法是,單條語(yǔ)句只在第一處位置使用隱式括號(hào),其他位置都顯式地把括號(hào)寫出來。例如:
console.log Math.floor(1.7), Math.ceil(1.7)
將正確編譯為:
console.log(Math.floor(1.7), Math.ceil(1.7));
此外,不帶參數(shù)的函數(shù)調(diào)用,將不能省略括號(hào)。例如你想要init();語(yǔ)句,那么在CoffeeScript中你也需要寫作init()。
語(yǔ)句都是表達(dá)式在CoffeeScript中,所有的語(yǔ)句都視為表達(dá)式。請(qǐng)看這樣的語(yǔ)句:
name = if 1 is true "green tea" else "black tea"
這在CoffeeScript中是合法的,將被編譯為:
name = 1 === true ? "green tea" : "black tea";
因此可以正常運(yùn)行。類似的,其他種類的語(yǔ)句也可以這樣使用,CoffeeScript都會(huì)很好地處理它們。
從CoffeeScript中學(xué)習(xí)JavaScriptCoffeeScript所做的很多語(yǔ)言特性增強(qiáng),都來源于JavaScript的最佳實(shí)踐??匆豢淳幾g后的JavaScript,就可以了解到CoffeeScript是如何實(shí)現(xiàn)的,這可能對(duì)學(xué)習(xí)JavaScript也有所幫助。例如,CoffeeScript可使用?在賦值之前檢查變量是否存在:
draw?.tool = "pencil"
編譯后的代碼:
if (typeof draw !== "undefined" && draw !== null) { draw.tool = "pencil"; }
這里CoffeeScript展示了JavaScript的“空比較”的最正確的方法。
再例如,CoffeeScript可使用=>來定義綁定上下文(this)的函數(shù):
rest = (drink) => @status = "Have a #{drink}!"
對(duì)應(yīng).js是:
rest = (function(_this) { return function(drink) { return _this.status = "Have a " + drink + "!"; }; })(this);
可以看到CoffeeScript用了一個(gè)特定結(jié)構(gòu)實(shí)現(xiàn)了函數(shù)綁定,這個(gè)寫法也同樣是有用的參考。
CoffeeScript調(diào)試的問題你可能也想到了,如果需要調(diào)試,瀏覽器的錯(cuò)誤提示是針對(duì)編譯后的JavaScript而不是原CoffeeScript,因此調(diào)試分析會(huì)比較麻煩。這是事實(shí),但我認(rèn)為影響不大,有以下幾點(diǎn)原因:
語(yǔ)法錯(cuò)誤會(huì)在CoffeeScript編譯時(shí)提示,這個(gè)提示針對(duì)CoffeeScript源碼,可以預(yù)先看到(如果不修正,是不能得到編譯后的JavaScript的)。
CoffeeScript和JavaScript實(shí)現(xiàn)同一邏輯功能的結(jié)構(gòu)差異較小,如果有錯(cuò)誤,可以類比推斷。
CoffeeScript支持Source Maps,可以在編譯同時(shí)生成.map文件,幫助調(diào)試。
其他JavaScript的轉(zhuǎn)譯語(yǔ)言可以轉(zhuǎn)譯為JavaScript的語(yǔ)言一般稱為altJS(Alternative JavaScript)。JavaScript語(yǔ)言本身有較多不方便、有缺陷的地方,且自由度過高,因人和JavaScript庫(kù)的不同,代碼風(fēng)格可能會(huì)相差很大,難于維護(hù)。因此,使用altJS將是有效的解決方法之一。
除本文介紹的CoffeeScript外,主流alsJS還有TypeScript[]。其中Haxe除JavaScript外,還可以編譯為其他各類平臺(tái)的語(yǔ)言,如C++、C#、Java等,算是通用型編程語(yǔ)言。根據(jù)實(shí)際開展工作的需要,這些altJS也都值得嘗試。
結(jié)語(yǔ)總的來說,CoffeeScript相比JavaScript,寫起來代碼會(huì)少一點(diǎn),好用的語(yǔ)言特性要多一點(diǎn),大概就像是在用一種更標(biāo)準(zhǔn)的形式使用JavaScript。
“它只是JavaScript”,保持這樣的心態(tài),CoffeeScript也許可以幫到你。
(重新編輯自我的博客,原文地址:http://acgtofe.com/posts/2014/11/have-a-cup-of-coffeescript)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85396.html
摘要:長(zhǎng)期以來,他都是和等機(jī)構(gòu)的講師,其技術(shù)課程獲得一致好評(píng)。但是,如果讓我預(yù)測(cè)的話,我認(rèn)為未來是很光明的,而現(xiàn)在就是擁抱技術(shù)棧的最佳時(shí)機(jī)。所以在瀏覽器和服務(wù)器之間代碼不需要上下文切換。如果沒有上下文切換,那么生產(chǎn)力也會(huì)更高。 非商業(yè)轉(zhuǎn)載請(qǐng)注明作譯者、出處,并保留本文的原始鏈接:http://www.ituring.com.cn/article/195742 Azat Mardan...
摘要:圖靈社區(qū)看來,移動(dòng)互聯(lián)網(wǎng)開發(fā)會(huì)成為下一行業(yè)焦點(diǎn),你覺得呢移動(dòng)互聯(lián)網(wǎng)開發(fā)已經(jīng)是焦點(diǎn)了。圖靈社區(qū)現(xiàn)在有很多基于改進(jìn)的語(yǔ)言,比如,等等。熱愛跨瀏覽器開發(fā)帶來的挑戰(zhàn)熱愛互聯(lián)網(wǎng)技術(shù)的種種異端,熱愛業(yè)內(nèi)的同行,熱愛你的工具。 非商業(yè)轉(zhuǎn)載請(qǐng)注明作譯者、出處,并保留本文的原始鏈接:http://www.ituring.com.cn/article/1791 尼古拉斯·澤卡斯(Nicholas...
摘要:背景當(dāng)知道要上傳的視頻資料從條變成條時(shí),我就明白,絕對(duì)不能再人工處理了。 背景 當(dāng)知道要上傳的視頻資料從20條變成100條時(shí),我就明白,絕對(duì)不能再人工處理了。他們總是想當(dāng)然的認(rèn)為,錄入一條數(shù)據(jù)需要1分鐘,那錄入20條數(shù)據(jù)就是20分鐘,錄入100條數(shù)據(jù),不就是100分鐘嗎?我有時(shí)候,真的很想問問他們,沒有考慮過人是會(huì)犯錯(cuò)的嗎?數(shù)據(jù)越多,出錯(cuò)的可能就越大;但是數(shù)據(jù)本身,又是不允許出現(xiàn)紕漏的...
摘要:而造成一些莫名其妙的錯(cuò)誤。寫一個(gè)文件打印出編譯命令會(huì)在同級(jí)目錄下生成一個(gè)同名的文件。將包裹在了一個(gè)匿名函數(shù)當(dāng)中,并用調(diào)用,這樣使得代碼隔離,不會(huì)和外部混淆。其中的表示的就是為了方便使用,可以使用雙冒號(hào)來替代。 很早就知道這CoffeeScript一門語(yǔ)言,但是一直沒有機(jī)會(huì)系統(tǒng)的學(xué)習(xí)下,那天趁在公司沒有什么要緊的項(xiàng)目做,就根據(jù)CoffeeScript首頁(yè)的例子學(xué)了一下。 引用Coffe...
閱讀 1280·2021-09-27 13:35
閱讀 2581·2021-09-06 15:12
閱讀 3395·2019-08-30 15:55
閱讀 2854·2019-08-30 15:43
閱讀 444·2019-08-29 16:42
閱讀 3458·2019-08-29 15:39
閱讀 3075·2019-08-29 12:28
閱讀 1254·2019-08-29 11:11