Как использовать 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?
Ответы
Ответ 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