JavaScript数组中的负索引

Array.prototype.slice() 提供了一种简单的方式来访问数组末尾的元素,使用负数作为 start 值。虽然这听起来很方便,但返回的值是一个数组,所以需要使用索引来获取单个元素。

通常情况下这并不太麻烦,但是探索其他选项可以更好地理解语言。在这种情况下,我们可以使用 Proxy 对象来允许使用负索引访问数组中的数据。为此,需要为 get 陷阱定义一个适当的处理程序。

陷阱的第二个参数对应传递的索引,但它是一个字符串,所以必须先使用 Number() 将其转换为数字。然后,可以使用 Array.prototype.length 来计算实际元素的位置。最后,可以使用 Reflect.get() 来获取特定索引处的值,但它期望第二个参数是一个字符串。

将所有内容放在一起,代码如下所示:

const handler = {
  get(target, key, receiver) {
    const index = Number(key);
    const prop = index < 0 ? `${target.length + index}` : key;
    return Reflect.get(target, prop, receiver);
  },
};

const createArray = (...elements) => {
  const arr = [...elements];
  return new Proxy(arr, handler);
};

let arr = createArray('a', 'b', 'c');

arr[-1]; // 'c'
arr[-1]; // 'b'