Array.prototype.splice 的一個坑

,發表於2018-12-26

在 JS 中,陣列在需要移除元素的時候,只能通過索引值來移除:

var container = [];
container.push("a");
container.push("b");
container.push("c");  // ["a", "b", "c"]


var idx = container.indexOf("z"); // -1
container.splice(idx, 1);  // ["c"]

之後我想到 JS 對於負值引數,會從陣列的結尾算起始點。那我這樣寫是否可以呢:

container.splice(idx < 0 ? -Infinite : idx, 1);  // ["a"]

而使用 Infinite 是可以的:

container.splice(idx < 0 ? Infinite : idx, 1);  // []

在查詢了規範後發現,這個起始位置是按照如下規則定義的:

22.1.3.26Array.prototype.splice ( start, deleteCount, ...items ) ...

  1. If relativeStart < 0, let actualStart be max((len + relativeStart), 0); else let actualStart be min(relativeStart, len).

也就是對於絕對值小於 len 的負數,效果是從陣列的尾部開始查詢起始位置,但是當絕對值大於 len 的時候,起始位置就是 0

可以這樣理解,引數的正負號決定了查詢的方向,實際查詢範圍為[-len, len]。

PS: 在 ES6 中我們可以愉快的使用 Set ,而無需再使用陣列進行模擬啦!

相關文章