假设我有一个关联数组Foo,键值和值xyz.
console.log(Foo['bar']);
>> xyz
delete Foo['bar'];
console.log Foo['bar'];
>> undefined
Foo['bar'] = 'xyz';
console.log(Foo['bar']);
>> xyz
Foo['bar'] = undefined;
console.log (Foo['bar']);
>> undefined
Run Code Online (Sandbox Code Playgroud)
我的问题是,两者中哪一个更有效率,它们有何不同?有什么情况我应该使用一个而不是另一个?
谢谢!
结果:
感谢大家帮忙并向我展示jsperf.将其设置为undefined似乎(相对)明显快于删除,尽管下面指出的所有注意事项也非常有趣(事实上,我可能会使用删除很多,以避免将来的左边错误).
经过一些实验和研究,我得出的结论是,至少在我的机器上,使用delete运算符比赋值慢 6 倍undefined。尽管如此,重要的是要记住jAndy 所说的关于原型链和属性存在的内容。
如果您想重新执行我的测试,我实例化了一个包含 50,000 个项目的数组。(只要项目数量足够大以显示两个测试之间的差异,项目数量并不重要。)
let arr = new Array(500000).fill(null).map(() => ({"item": 42}));
Run Code Online (Sandbox Code Playgroud)
然后,我计算了将数组中每个对象的 item 属性分配给 undefined 所需的时间,以及删除数组中每个对象的 item 属性所需的时间。
console.time("Assignment To Undefined");
arr.forEach(object => object.item = undefined);
console.timeEnd("Assignment To Undefined");
//Reset the array here...
console.time("Deletion");
arr.forEach(object => delete object.item);
console.timeEnd("Deletion");
Run Code Online (Sandbox Code Playgroud)
我的所有结果:
我没有对这些操作的性能进行基准测试(正如我在评论中提到的,只是在http://www.jsperf.com上创建了一些基准),但我会在差异上失去一些说法.
您将永远善于delete处理属性,将其设置为undefined或null将让人和/或代码挂起,以便与IN操作员核实.
喜欢
if( 'bar' in Foo ) { }
Run Code Online (Sandbox Code Playgroud)
true如果你设置Foo.bar为仍将返回undefined.如果你去,它不会delete Foo.bar.
从长远来看,它会产生负面的性能差异,因为b在后者分配给undefined. 例如:
var a = { b : 0 };
a.b = undefined;
a.hasOwnProperty("b");
>>> true
Run Code Online (Sandbox Code Playgroud)
这同样适用于in关键字("b" in a是真的),因此这很可能会阻碍迭代时,一个更大的物体的一部分。
除了基准测试删除或分配给的实际操作外undefined,还应该考虑更改对象后使用该对象的未来性能。
我可以想到两个:
删除属性后,对其进行访问将使JavaScript在原型链中查找它,而如果该属性仍然存在于对象(带有undefined值)中,则不会搜索原型链。
删除属性会更改“对象形状”,并可能会损害JavaScript优化。