属性访问的Javascript性能:未定义vs false
使用集合时,我想知道在以下两者之间的最佳实践是什么:不定义属性(当属性丢失时)还是将其定义为false 例如: 第一种情况:属性访问的Javascript性能:未定义vs false,javascript,performance,properties,undefined,Javascript,Performance,Properties,Undefined,使用集合时,我想知道在以下两者之间的最佳实践是什么:不定义属性(当属性丢失时)还是将其定义为false 例如: 第一种情况: [ {"age":42}, // first item {} // second item, age is undefined ] 第二种情况: [ {"age":42}, // first item {"age":false} // second item, age is explicitly set to false ] 然后将此集合与MongoDB一起使用,或者
[
{"age":42}, // first item
{} // second item, age is undefined
]
第二种情况:
[
{"age":42}, // first item
{"age":false} // second item, age is explicitly set to false
]
然后将此集合与MongoDB一起使用,或者在AngularJS repeat内使用,或者其他任何方式,我可能会执行以下操作:
if (item.age){ doSomething();}
这两个选项都是正确的
我个人认为,第一个案例很有意思,因为如果我们没有信息,我们不会具体说明,但是否存在寻找失踪财产的成本、缺陷或风险
…但是,找到丢失的财产是否有成本、缺陷或风险
没有任何意义,不。从技术上讲,当你查找一个不在对象上的属性时,JavaScript引擎必须检查对象的原型(以及它的原型,等等),这在理论上要慢一点(理论和现实可能不同),但原型链必须是深的,或者,你必须在一个时间敏感的紧循环中对成千上万的对象执行此操作,这才有意义——如果是这样的话
如果将属性关闭,而不是<代码> false <代码>,您可能会考虑<代码>未定义或<代码> NUL>代码>。它们也是假的,但(无论如何,在我看来)它们暗示的更少。请注意,如果您在应用程序的某个地方使用JSON,那么JSON没有未定义的
记住这条公理:“不要过早地优化。”这在JavaScript世界中尤其适用,因为在一个JavaScript引擎上使某个东西更快的东西会在另一个引擎上使它变慢。因此,几乎所有JavaScript性能问题的答案都是:测试并查看
直接从Object.prototype
派生的对象上;三种主要浏览器上的结果:
,测试20深原型层次结构的非常不现实的情况:
这取决于您的性能需求。如果要优化数据存储,应减小数据大小。如果脚本编写时间更重要,正确的方法是将false设置为默认值。但第二种方法可以提供错误,从错误日志中隐藏。因此,在调试过程中可能会出现问题。您指出了正确的问题,使用undefined将在序列化过程中删除该属性。以下是正确的:
JSON.stringify({“age”:undefined})=“{}”
相反,使用null让我感觉属性应该包含一个对象。@FlavienVolken:如果序列化为JSON,它将被删除,是的,正如我上面指出的。Renull
,这当然是它通常使用的方式,但是,false
让我感觉属性应该包含布尔值。:-)在这两种方法中,我可能会使用null
(但我可能会完全关闭该属性)。最后,我切换回undefined
,因为您的性能图表显示它稍微快一点。是的,添加一个false
可能意味着检查它不是一个基本上不好的布尔值。更新:使用Meteor,所有未定义的属性在序列化之前都转换为null
。