在 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 ,而无需再使用数组进行模拟啦!