在Javascript中,“for(attr in this)”通常很危险...我同意。这就是我喜欢Coffeescript的原因之一。但是,我正在编写Coffeescript并且有一个案例需要Javascript的“for(attr in this)”。在Coffeescript中有一个很好的方法吗?
我现在正在做的是在嵌入式原始Javascript中编写一堆逻辑,例如:
...coffeescript here...
for (attr in this) {
if (stuff here) {
etc
}
}
使用尽可能少的Javascript会很好...有关如何实现这一点并最大限度地使用Coffeescript的任何建议?
答案 0 :(得分:16)
您可以使用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!'
。
own
已编译:https://gist.github.com/62860f0c07d60320151c
它接受循环中的键和值,这非常方便。您可以在for
之后插入if object.hasOwnProperty(attr)
关键字,以便执行{{1}}检查,该检查应该过滤掉您不想要的原型中的任何内容。
答案 1 :(得分:6)
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
通常会更安全。
答案 2 :(得分:2)
您可以使用for x in y
或for x of y
,具体取决于您希望如何解释元素列表。最新版本的CoffeeScript旨在解决这个问题,你可以通过一个问题了解它的新用法(已经实现并关闭)here on GitHub