在ColdFusion中,以下哪个更高效?
isDefined('url.myvar')
或者structKeyExists(url, 'myvar')
在ColdFusion中,以下哪个更高效?
isDefined('url.myvar')
或者structKeyExists(url, 'myvar')
现在的 ColdFusion 版本(CF8+)中,两者之间的速度差距并不是很大。然而,structKeyExists
确实略快一些。原因如下。
使用 isDefined
时,传入的字符串会在多个作用域中查找作为键名。从 CF9 开始,按照以下顺序检查作用域列表: (来源)
即使您在 isDefined
中使用了作用域名称(例如:if isDefined('variables.foo')
),列表仍将按顺序进行检查;如果定义了变量 local.variables.foo
,它将在 variables.foo
之前被找到。
另一方面,structKeyExists
仅在传递给它的结构中搜索键名的存在;因此,需要查找的位置要少得多。
通过使用更明确的代码(如 structKeyExists
),不仅可以获得一些性能优势,而且代码在我看来更易读和可维护。
使用易于阅读且最能展示你正在做的内容的那个。
两者之间的差异非常小,很可能根本不值得担心。
除非有经过证明的且可重复测试的案例证明代码缓慢,否则不要浪费时间优化代码。
structKeyExists
的普通用户。我发现它的显式性质使一切都清晰明了,而isDefined
并不总是如此,这会导致在几个月或几年后回到旧代码(和/或别人的代码)时需要更多的时间和头痛。 - Adam Tuttle
structKeyExists()
存在一个大问题。如果您使用 ColdFusion 反序列化 JSON 字符串,并且您有一个值为null
的属性myVal
,那么structKeyExists(object, "myVal")
将返回true
,而isDefined("object.myVal")
不会。换句话说,如果您在使用structKeyExists()
检查后尝试访问属性object.myVal
,则会出现错误。 - android