Ada*_*tle 39

这些天(CF8 +)的速度差异不是那么大.但是,structKeyExists确实要快一点.这就是原因.

使用时isDefined,您传入的字符串将作为多个范围中的键名进行搜索.从CF9开始,检查顺序的范围列表是:( 来源)

  1. 本地(仅限本地函数,UDF和CFC)
  2. 参数
  3. 线程本地(仅限内部线程)
  4. 查询(不是真正的范围,适用于查询循环中的变量)
  5. 线
  6. 变量
  7. CGI
  8. CFFILE
  9. 网址
  10. 形成
  11. 曲奇饼
  12. 客户

即使您使用范围名称isDefined(如if isDefined('variables.foo'):),仍将按顺序检查列表; 如果local.variables.foo定义了变量,它将在BEFORE之前 找到variables.foo.

另一方面,structKeyExists只搜索你传递它的结构是否存在密钥名称; 所以要看的地方要少得多.

通过使用更明确的代码(structKeyExists),我不仅获得了一些性能,而且在我看来,您的代码更具可读性和可维护性.

  • 不过,“structKeyExists()”有一个大问题。如果您使用 ColdFusion 反序列化 JSON 字符串,并且有一个值为“null”的属性“myVal”,则“structKeyExists(object, "myVal")”将返回“true”,而“isDefined("object.myVal")” ` 不会。或者换句话说,如果您在检查“structKeyExists()”后尝试使用“object.myVal”访问该属性,您将收到错误。 (2认同)

Pet*_*ton 10

使用更易于阅读的内容,最好地展示您正在做的事情.

两者之间的差异非常小,很可能根本不值得担心.

不要浪费时间优化代码,除非你有一个经过验证可重复的测试用例来证明它的缓慢性.

  • +1。了解 * 如何 * 这两个函数的运行方式绝对值得。但是,除非您遇到性能问题,否则编写行为正确的可读代码在 IMO 中更为重要。 (2认同)