【问题标题】:Running object property function in a loop循环运行对象属性函数
【发布时间】:2013-11-09 02:59:00
【问题描述】:

我正在遍历一个对象并将属性名称与给定参数进行比较;如果匹配,我希望执行属性函数。除了显式,我怎么称呼它?

对象:

@headers =
   'foo': (obj)->
       # do stuff

例行公事:

resolve: ('foo', item, obj)->
   for prop of @headers
      if prop == arguments[0]
         # execute obj's foo property

【问题讨论】:

  • 是的,已编辑。我的错。

标签: javascript function object coffeescript javascript-objects


【解决方案1】:

好吧,您需要命名第一个参数,因为 CoffeeScript 不希望有字符串。

但是,如果我理解正确,您可以在 member operator 之后使用 ? "existential" 运算符(记录在 Operators and Aliases 的小节中):

resolve: (prop, item, obj)->
   if @headers[prop]?
      obj[prop]()

这将编译为:

resolve: function(prop, item, obj) {
  if (this.headers[prop] != null) {
    return obj[prop]();
  }
}

而且,如果您还想测试obj 上的方法,您可以将? 放在成员运算符和参数/调用括号之间:

obj[prop]?()

【讨论】:

  • 字符串参数是为了清晰起见。性能方面,检查道具是否存在和迭代对象之间有什么区别吗?我假设解析器仍然需要查看每个属性并在两种情况下进行比较。
  • @Metzger 好吧,对于程序员的性能,我会说“if has prop”比“for each prop, if等于。”对于执行性能,唯一确定的方法是进行基准测试 (JSPerf)。但是,大多数引擎可能会使用 hash tables 之类的东西来优化循环中的单个属性访问。
猜你喜欢
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 2021-11-20
相关资源
最近更新 更多