我需要删除数组中的一些元素,但是不想重新排列数组。
如果我使用 "delete" 删除我的元素,这些 "空洞" 会占用内存吗?
var array=["A","B","C"];
delete array[1]; // array -> ["A", undefined, "C"]
我认为被删除的元素真的被删除了,所以它不会占用内存空间,这不是真的吗?
我需要删除数组中的一些元素,但是不想重新排列数组。
如果我使用 "delete" 删除我的元素,这些 "空洞" 会占用内存吗?
var array=["A","B","C"];
delete array[1]; // array -> ["A", undefined, "C"]
我认为被删除的元素真的被删除了,所以它不会占用内存空间,这不是真的吗?
完全取决于实现。在内部,所有JS表示最终都将转换为稀疏表示,但稀疏表示倾向于使用更多的内存和比非稀疏数组访问速度更慢。
因此,从密集数组中删除一个值不太可能释放任何内存,但在删除足够多的元素后,实现很可能会转换为稀疏表示以节省整体内存。
注意:您删除的索引处的对象或值不会立即被删除--删除只是从对象中删除属性槽--只有在GC传递期间,并且只有没有其他引用时,对象/值才会被删除。
您可以使用array.splice(1, 1);
。它将删除索引为1的一个条目。第一个参数是索引,第二个参数是计数。
有很多方法可以做到这一点。其中之一是创建不包括索引的数组切片,然后将这些切片连接起来。
var arr = ["A", "B", "C"];
const idx = 1;
//Before
console.log(arr);
arr = arr.slice(0, idx).concat(arr.slice(idx + 1));
//After
console.log(arr);