Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
属性访问的Javascript性能:未定义vs false_Javascript_Performance_Properties_Undefined - Fatal编程技术网

属性访问的Javascript性能:未定义vs 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一起使用,或者

使用集合时,我想知道在以下两者之间的最佳实践是什么:不定义属性(当属性丢失时)还是将其定义为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一起使用,或者在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,它将被删除,是的,正如我上面指出的。Re
null
,这当然是它通常使用的方式,但是,
false
让我感觉属性应该包含布尔值。:-)在这两种方法中,我可能会使用
null
(但我可能会完全关闭该属性)。最后,我切换回
undefined
,因为您的性能图表显示它稍微快一点。是的,添加一个
false
可能意味着检查它不是一个基本上不好的布尔值。更新:使用Meteor,所有未定义的
属性在序列化之前都转换为
null