在Javascript中更有效,删除元素或将其设置为未明确定义

Abr*_*m P 13 javascript

假设我有一个关联数组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似乎(相对)明显快于删除,尽管下面指出的所有注意事项也非常有趣(事实上,我可能会使用删除很多,以避免将来的左边错误).

Dan*_*nii 9

经过一些实验和研究,我得出的结论是,至少在我的机器上,使用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)

我的所有结果:

  • 删除:大约 200 - 170 毫秒。
  • 作业:大约 15 - 40 毫秒。


jAn*_*ndy 6

我没有对这些操作的性能进行基准测试(正如我在评论中提到的,只是在http://www.jsperf.com上创建了一些基准),但我会在差异上失去一些说法.

您将永远善于delete处理属性,将其设置为undefinednull将让人和/或代码挂起,以便与IN操作员核实.

喜欢

if( 'bar' in Foo ) { }
Run Code Online (Sandbox Code Playgroud)

true如果你设置Foo.bar为仍将返回undefined.如果你去,它不会delete Foo.bar.


Aes*_*ete 6

请注意,如果原型链上存在属性,则从对象中删除属性将使用相同名称替换该属性.

将属性设置为null或undefined将简单地掩盖它.


0x4*_*2D2 5

从长远来看,它会产生负面的性能差异,因为b在后者分配给undefined. 例如:

var a = { b : 0 };

a.b = undefined;

a.hasOwnProperty("b");
>>> true
Run Code Online (Sandbox Code Playgroud)

这同样适用于in关键字("b" in a是真的),因此这很可能会阻碍迭代时,一个更大的物体的一部分。


spl*_*tor 5

除了基准测试删除或分配给的实际操作外undefined,还应该考虑更改对象后使用该对象的未来性能。

我可以想到两个:

  1. 删除属性后,对其进行访问将使JavaScript在原型链中查找它,而如果该属性仍然存在于对象(带有undefined值)中,则不会搜索原型链。

  2. 删除属性会更改“对象形状”,并可能会损害JavaScript优化