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'