Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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 为什么从对象中删除要比拼接数组快?_Javascript_Arrays - Fatal编程技术网

Javascript 为什么从对象中删除要比拼接数组快?

Javascript 为什么从对象中删除要比拼接数组快?,javascript,arrays,Javascript,Arrays,我很想看看数组和对象之间的速度差异,所以我设置了一个测试,用于填充、访问和删除数组和对象中的100000项。对数组的访问和填充大致相等,相差约3ms。但是,从数组中删除会导致604ms差异(10ms与614ms)。为什么会这样?我认为对象和数组差不多 演示:执行此操作时,必须重新分配所有后续数组项。也就是说,必须更改拼接后的每个属性名称。除了对属性进行直线遍历之外,并没有什么好方法可以做到这一点;使该操作快速的数据结构会使其他更常见的操作变慢 考虑数组 [ 1, 2, 3,4 ] < /代码>。

我很想看看数组和对象之间的速度差异,所以我设置了一个测试,用于填充、访问和删除数组和对象中的100000项。对数组的访问和填充大致相等,相差约3ms。但是,从数组中删除会导致604ms差异(10ms与614ms)。为什么会这样?我认为对象和数组差不多


演示

执行此操作时,必须重新分配所有后续数组项。也就是说,必须更改拼接后的每个属性名称。除了对属性进行直线遍历之外,并没有什么好方法可以做到这一点;使该操作快速的数据结构会使其他更常见的操作变慢


考虑数组<代码> [ 1, 2, 3,4 ] < /代码>。属性“0”的值为

1
。如果您将该条目拼接出来,那么运行时必须将属性“0”设置为
2
,将属性“1”设置为
3
,将属性“2”设置为
4
,您只需执行不同的操作即可。“delete”只会将数组位置设置为未定义。而splice将通过对阵列的所有10000个项目执行arr[i]=arr[i+1]的循环来完全移除它。您可以对所有10000个项目执行此操作。另请参见

函数调用非常昂贵!使用
delete
关键字和
.splice
功能之间有很大的区别。永远不要使用日期进行时间测量。使用
performance.now()。更新后,仍然相差约600毫秒。另一点:
delete
可能会导致去优化(如在v8中删除隐藏类)。这是为什么?当规范明确没有提供任何详细信息时,您正在询问实现细节。ECMA-262为所有对象提供了一个索引,因此如果数组和普通对象不同,这取决于可能对其他更常见的操作(例如属性查找索引)进行优化的实现,这些操作会影响删除的性能。“据我所知,您的对象“obj”是一个数组,“---是吗?”“删除”“将仅将数组位置设置为未定义”-不会,它会在数组中创建一个孔。与仅设置未定义不同,因为foreach和map函数会忽略该位置。