问题
Array.prototype.splice()
修改数组,返回已删除的元素。
是否有更有效的方法从数组中删除元素,而不返回该元素,这在功能上是等效的? - 它是否会以同样的方式影响记忆?
var a = [];
a.length = 500;
a.fill(1);
//--------------------
a[250] = a[499];
a.length--;
//--------------------
和
var a = [];
a.length = 500;
a.fill(1);
//--------------------
a.splice(250, 1);
//--------------------
这些数组是否包含相同的元素(尽管有顺序),并占用相同数量的内存?
答案 0 :(得分:0)
他们远不及等同;即使在那个稀疏阵列中,也要进一步思考......
const arr1 = Array(500).fill();
arr1[arr1.length - 1] = "Bob";
arr1; // 499x undefined, 1x Bob
arr1[250] = arr[499];
arr1.length -= 1;
arr1; // 250x undefined, 1x Bob 248x undefined
// compare the above with
const arr2 = Array(500).fill();
arr2[arr2.length - 1] = "Bob";
arr2.splice(250, 1);
arr2; // 498x undefined 1x Bob
// compare that with
const arr3 = Array(500).fill();
arr3[arr3.length - 1] = "Bob";
const arr4 = arr3.slice(0, 250).concat(arr3.slice(251));
arr3; // 499x undefined 1x Bob
arr4; // 498x undefined 1x Bob
// if you wanted to hand-wind a "splice" which did actually work the way you thought it did,
// you might try soemething like
function splice (arr, start, offset) {
let i = 0;
while (start + i + offset < arr.length) {
arr[start + i] = arr[start + i + offset];
i += 1;
}
arr -= offset;
}
我可能在最后一个函数中有一个错误的错误;我正试图进入休假模式。
此时我还没有其中一个。