Search
Write a publication
Pull to refresh

10 особенностей coffescript, о которых вы могли не знать

На этой недели я прочитал несколько интересных статей по CoffeeScript пока готовил материалы для тренинга. В процессе я обнаружил несколько особенностей о которых раньше не знал.

Циклы


Вы возможно уже знакомы со стандартным способом обхода массива в CoffeeScript.
for name in ['Tom','Dick','Harry']
  alert "Hi, #{name}"


Но знали ли вы о том, что можно добавить доболнительный аргумент и получить текущий индекс?

for name, i in ['Tom','Dick','Harry']
  alert "Hi, #{name} - you are number #{i}"

=> "Hi, Tom - you are number 1"
=> "Hi, Dick - you are number 2"
=> "Hi, Harry - you are number 3"


Динамические параметры


JavaScript (и CoffeeScript) не требует четкого соблудения количества аргументов отправляемых в функции. В этом примере последние нескольео параметров будут просто проигнорированы.

planets = (first, second, third) ->
  alert third
   
planets 'Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter'
# alert will be 'Earth'


Но вы знали, что CoffeeScript поддерживает и такой вариант?

planets = (first, second, others...) ->
  alert others
 
planets 'Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter'
# alert will be 'Earth','Mars','Jupiter'


Циклы (Comprehensions)


CoffeeScript также поддерживает comprehensions – немного похожие на рубишный map

class Person
  constructor: (name, email) ->
    @name = name
    @email = email
 
userEmails =
  tom: 'tom@example.com'
  dick: 'dick@example.com'
  harry: 'harry@example.com'
 
contacts = for name, email of userEmails
  new Person(name,email)


Множественное присваивание


Множественное присваивание — возможность присвоить значение нескольким переменным за раз. Например, вы можете использовать его для обмена значениями между двумя переменными в одной строке.

one = 1
two = 2
[one, two] = [two, one]


Вы так же можете использовать для передачи параметров в функцию.

date = ->
  [25,'April',2013]
 
[day, month, year] = date()


Это даже работает для нескольких уровней вложенности!

person =
  name: 'John'
  email: 'john@example.com'
  address:
    street: [
      '123 Main Street'
      'Apt 8B'
    ]
    city: 'Gotham'
    zip: '8442'
 
{ address: { street: [_, apartment], city } } = person


Динамические параметры вместе с множественым присваиванием


Динамические параметры вместе с множественым присваиванием дают вам еще один мощный способ для работы с массивами переменной длины.

daysOfTheWeek = "Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday"
 
[first, rest..., last] = daysOfTheWeek.split ','


Сравнеения


CoffeeScript позволяет нам использовать цепные сравнения (заимствованные из питона), которые позволяют легко проверять входит ли значение в промежуток.

temperature = 72
niceDay = 82 > temperature > 68


Строки


Вы возможно знаете, что CoffeeScript позволяет вставлять переменны в строки (используя рубишный синтакс).

name = "John"
surname = "Doe"
 
greeting = "Hi, #{name} #{surname}"


Но знали ли вы, что JavaScript поддерживает форматированный текст? Отступ, скоторого начинается текст сохраняется, так что вы можете держать его в полном порядке.

html = """
       <p>
       Hi, #{name} #{surname}
       </p>
       """


Прототип класса


Вы вероятно знаете, что @ является сокращением от `this`. Но знали ли вы, что CoffeeScript так же имеет сокращение для доступа к прототипу класса?

String::pipeDelimited = ->
  @split '|'
 
alert "ABC|abc".pipeDelimited()


Привязка параметров к свойствам


CoffeeScript позволяет нам присваивать значения на свойства непосредственно используя "@". К примеру, вы часто хотите назначить параметры в конструкторе.

class Person
  constructor: (name) ->
    @name = name


Но вы можете использовать сокращенный вариант. CoffeeScript это единственный язык, который позволяет делать такие вещи.

class Person
  constructor: (@name) ->


Статическик функции


С помощью "@" так же можно определить функции класса.

class Number
  @random: ->
    return 4  # chosen by fair dice roll
                    # guaranteed to be random
               
alert Number.random()

Мое выполнение функции выше ссылается на XKCD.

Happy coding.

Данная статья является переводом этой.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.