Minden nyelvnek megvannak a saját jól bevált kifejezés mintái és gyakorlatai. A CoffeeScripttel sincs másképp. Ez a fejezet feltárja ezeket a konvenciókat és megmutat néhány JavaScript és CoffeeScript-beli eltérést, így kapva gyakorlati képet a nyelvről.
JavaScriptben a tömb minden elemén való végigiterálásához használhatjuk az újonnan hozzáadott forEach() funkciót vagy a régi C stílusú for ciklus. Ha tervezzük a JavaScript ECMAScript5-ben bevezetett legújabb funkcióinak a használatát, azt ajánlom, hogy használjunk kiegészítő könyvtárakat a régebbi böngészők támogatásához, amelyek emulálják ezeket a funkciókat.
Bár a forEach() szintaxisa sokkal tömörebb és olvashatóbb, attól a hátránytól szenved, hogy a callback funkció meghívódik minden egyes iterációnál a tömbön, ezért sokkal lassabb az ugyanolyan for ciklusnál. Lássuk ez hogyan néz ki CoffeeScriptben.
Belátható, hogy olvashatóbb és tömörebb a szintaxis . Ami a legjobb, hogy for ciklussá fordul át a színfalak mögött. Más szavakkal a CoffeeScript szintaxisa ugyanolyan kifejezést kínál mint a forEach(), de a sebesség és a kiegészítő könyvtárak kifogások nélkül.
A forEach()-hez hasonlóan, az ES5 bevezeti a natív map funkciót is, amely sokkal tömörebb mint a klasszikus for ciklus, név szerint a map()-et. Sajnálatosan, ez a kifejezés ugyanolyan hátrányoktól szenved mint a forEach(), a sebessége nagyban csökken a funkcióhívások által.
Ahogyan felfedtük a szintaxis fejezetben, a CoffeeScript listakezelés és listafeldolgozása használható a map()-hoz hasonló viselkedéshez. Figyeljük meg, hogy a listafeldolgozást zárójelek veszik körbe, ami kritikus abból a szempontból hogy biztosítsuk a feldolgozás azzal tér vissza amit várunk, a leképzett tömbbel.
Ugyancsak, a ES5 tartalmaz egy filter() funkciót a tömbök redukálására, szűrésére:
A CoffeeScript szintaxisa a when kulcsszót használja az elemek szűréséhez egy összehasonlítással, kiválsztással. A háttérben egy for ciklus generálódik. Az egész végrehajtás egy anonymous funkcióban történik, hogy a funkció hatályokat betartsuk és a változó konfliktusokat elkerüljük.
Ne felejtsük el a zárójeleket kirakni, máskülönben a `result` lesz az utolsó elem a tömbben. A CoffeeScript listafeldolgozás annyira rugalmas, hogy olyan hatékony kifejezéseket és kiválasztásokat is megenged mint amit következő példában láthatunk:
Ha a listakifejezés túl hosszúra sikerülne, több sorba is törhetjük:
A tömbben egy érték tartalmazásának leellenőrzését tipikusan az indexOf()-al oldjuk meg, ami elégg agyzsibbasztóan még mindig kiegészítő könyvtárat igényel, mert az Internet Explorer ezt a funkciót nem implementálta.
A CoffeeScript rendelkezik egy ügyes alternatívával, amelyet a Pythonisták már kiszúrhattak, név szerint az `in`-nel.
A háttérben, a CoffeeScript az Array.prototype.indexOf()-ot használja. Behúzza a kiegészítő könyvtárat, ha szükséges annak az észlelése, hogy az érték a tömbben van-e. Sajnálatosan ez azt jelenti hogy az `in` szintaxis nem működik stringekre. Vissza kell állnunk indexOf()-ra és ellenőriznünk, hogy a visszatérési érték negatív-e:
Vagy még jobb, használhatjuk a bitenkéti operátort így nem kell végrehajtanunk a `-1`-es összehasonlítást.
Ahhoz, hogy végigiteráljunk a tulajdonságokon JavaScriptbe, az `in` operátort használjuk:
Bár, ahogy az előző bekezdésben láthattuk, a CoffeeScript már lefoglalta ennek a kulcsszónak a használatát a tömbökre. Ezért az operátor átneveződött `of`-ra és a következő módon használhatjuk:
Ahogyan láthattuk, megadhattuk a változókat a tulajdonság nevével és az értékével.
Ez a technikai nem kötődik specifikusan a CoffeeScripthez, de megemlítése mindenképpen hasznos. A `Math.max` és `Math.min` több argumentumot megenged így egyszerűen használtjuk a `...`-ot tömbök átadására, hogy megkapjuk a maximum és a minimum értékeket a tömbben.
Érdemes megjegyezni, hogy ez a trükk hibára fut nagyon nagy tömbök esetén, mert a böngészők korláttal rendelkeznek a funkciónak átadható paraméterek számossága terén.
A Math.max-os példában fent, a `...`-ot használtjuk, hogy szétszedjünk egy tömböt és többszörös argumentumként átadjuk a max-nak. A színfalak mögött, a CoffeeScript átalakítja a függvényhívást apply()-ra, ezzel biztosítva hogy a tömb argumentumokként adódik át. Ezt a funkciót másra is használhatjuk, úgy mint a függvény hívások proxyzása ill az argumentumokat megváltoztatására mielőtt továbbadódnak.
Vagy megváltoztatni az argumentumokat mielőtt továbbadódnak:
Ne feledje azonban, hogy a CoffeeScript automatikusan beállítja, a függvény hívás környezetét annak az objektumnak, amiből a függvény meglett hívva. A fenti példában, ez a `console` objektum. Ha szeretnénk a kontextust beállítani, akkor az meg kell hívnunk az apply() kézzel.
CoffeeScript-ben a kódolási stílus azt mutatja, hogy az `or` előnyösebb a `||`- nél és az `and` előnyösebb a `&&`-nél, mert ezek jobban olvashatóbbak. Mindazonáltal, a két stílus ugyanolyan végeredménnyel jár. Ez a beszédszerűbb előny érvényesül, az `is`-nél a `==` felett és az `inst` az `!=` felett.
Egy rendkívüli szép kiegészítés a CoffeeScript részéről a `or equals` kifejezése amit a Rubysták már ismerhetnek mint `||=`:
Ha a hash false-ra értékelődik ki, akkor beállítódik egy üres objektumra. Fontos megjegyezni, hogy ez a kifejezés a `0`, `””` és a `null`-t is false-nak ismeri fel. Ha nem ez a szándékunk, akkor a CoffeeScript egzisztenciális operátorát kell használnunk ,amely akkor aktiválódik amikor a hash `undefined` vagy `null`.
Az átrendező hozzárendeléseket bármilyen mélységben használhatjuk tömb vagy objektum egymásba ágyazott tulajdonságainak elérésénél.
Ez különösképp használható a Node alkalmazásokban modulok behúzásánál.
Külső könyvtárak használata ugyanolyan egyszerű mint funkciókat meghívni a CoffeeScriptben könyvtáraknál; mivel a nap végén minden JavaScriptté fordítódik át. A CoffeeScript jQuery-vel együtt használva különösképp elegáns, a jQuery API callbackjainak számossága miatt.
Mivel minden CoffeeScript kimenet egy anonymous funkcióba ágyazódik be, beállíthatunk egy `$` álnevet a jQuery számára. Ezzel elérhetjük, hogy még a jQuery konfliktusmentes módja és a `$` átállításakor is a funkciók ugyanúgy működjenek ahogyan elterveztük.
CoffeeScriptben a do kulcsszóval futtathatunk egy funkciót azonnal, ami egy jó módszer a scope-ok egymásba ágyazására és a változók megvédésére. Az alábbi példában, bevezetjük a `classToType` változót egy anonymous funkció kontextusában amit azonnal meghívunk a `do`-val, Ez az anonymous funkció visszatér egy másik anonymous funkcióval ami végül a `type` végső értékét fogja tartalmazni. Ahogyan a `classToType`-ot egy olyan kontextusban vezettük be ahol nem rendeltük sehová a referenciát, nem lehet a scope-on kívülről elérni.
Más szavakkal a `classToType` teljesen privát, és nem lehet soha többé hivatkozni a lefuttatott anonymous funkción kívül. Ez a minta jó a scope becsomagolás és a változó elrejtésére.