•  阅读 2 分钟

相对索引 `at` 方法

Array.prototype.at、各种类数组和 String.prototype.at 上的新方法 at 使得访问一个靠近集合末端的元素变得更加简单和简洁。

从一个集合的末端访问第 N 个元素是一个常见的操作。然而,通常的方法是很冗长的,比如 my_array[my_array.length - N],或者性能不是很好,比如 my_array.slice(-N)[0]。新的 at 方法使这个操作更符合人机工程学原理,它把负数参数解释为“从尾到头”。之前的例子可以表示为 my_array.at(-N)

为了统一起见,也支持正参数,并且等同于普通的属性访问。

这个新方法足够小,它的完整语义可以通过下面这个符合要求的 polyfill 实现来理解:

/**
 * Array.prototype.at 的 polyfill
 * @param arr {Array} an array
 * @param n {number} index of arr
 * @returns {undefined|*} arr.at(n)
 */
function at(arr, n) {
  // 把 n 转换为整数
  n = Math.trunc(n) || 0
  // 允许从尾部开始索引的负数
  if (n < 0) n += arr.length
  // 超出索引范围时返回 undefined
  if (n < 0 || n >= arr.length) return undefined
  // 最后,使用一般的索引属性访问
  return arr[n]
}

// at([1, 2], -1) // 2

关于字符串对象的一句话

由于 at 最终执行的是普通的索引,在字符串值上调用 at 会返回代码单位,就像普通索引一样。就像在字符串上的普通索引一样,代码单位可能不是你想要的 Unicode 字符串!请考虑是否更适合你的使用情况。请考虑 String.prototype.codePointAt() 是否更适合于你的使用情况。

支持 at 方法

方法 at 的环境支持情况:

  • Chrome 92+
  • Firefox 90+
  • Safari 15.4+
  • Node.js 16.8.0
  • Babel(通过 core-js 支持)

本文由 吳文俊 翻译,原文地址 at method for relative indexing

> cd ..