Подтвердить что ты не робот

Как использовать Javascript для (attr в этом) с Coffeescript

В Javascript "for (attr in this)" часто опасно использовать... Я согласен. Это одна из причин, по которой мне нравится Coffeescript. Тем не менее, я программирую в Coffeescript и имею случай, когда мне нужен Javascript "для (attr в этом)". Есть ли хороший способ сделать это в Coffeescript?

Теперь я пишу кучу логики во встроенном сыром Javascript, например:

...coffeescript here...
for (attr in this) {
  if (stuff here) {
    etc
  }
}

Было бы неплохо использовать как можно меньше Javascript... любые предложения о том, как я могу это достичь, и максимально использовать Coffeescript?

4b9b3361

Ответ 1

Вместо for item in items, который итерации через массивы, вы можете использовать for attr, value of object, который больше похож на for in на JS.

for own attr, value of this
  if attr == 'foo' && value == 'bar'
    console.log 'Found a foobar!'

Скомпилировано: https://gist.github.com/62860f0c07d60320151c

Он принимает как ключ, так и значение в цикле, что очень удобно. И вы можете вставить ключевое слово own сразу после for, чтобы обеспечить проверку if object.hasOwnProperty(attr), которая должна отфильтровывать что-либо из прототипа, который вы не хотите там.

Ответ 2

Ответ Squeegy правильный. Позвольте мне исправить это, добавив, что обычное решение JavaScript for...in, являющееся "опасным" (включая свойства прототипа), заключается в добавлении проверки hasOwnProperty. CoffeeScript может сделать это автоматически, используя специальное ключевое слово own:

for own attr of this
  ...

эквивалентен JavaScript

for (attr in this) {
  if (!Object.prototype.hasOwnProperty(this, attr)) continue;
  ...
}

Если вы сомневаетесь в том, следует ли использовать for...of или for own...of, в целом безопаснее использовать own.

Ответ 3

Вы можете использовать for x in y или for x of y в зависимости от того, как вы хотите интерпретировать список элементов. Последняя версия CoffeeScript направлена ​​на решение этой проблемы, и вы можете прочитать о ее новом использовании с проблемой (с тех пор она была реализована и закрыта) здесь, на GitHub