本文介紹js中陣列的at函式,屬於比較簡單的知識普及性文章,難度不大。
0x00
首先,我們可以思考如下一個問題,如果要獲取一個陣列的最後一個元素(這是很常用的操作),我們應該怎麼做? 相信大部分人能夠想到的程式碼是這樣的:
let last = array[ array.length - 1];
嗯,這是最常用的獲取陣列最後一個元素的方式,依此類推獲取倒數第二個,第三個的方式類似。 當然除了這種方式之外,還有其他的方式,比如:
let last = array.slice(-1)[0]
先通過slice獲取後面一個元素的陣列,然後通過下標0獲取最後一個元素。
在比如通過pop獲取最後一個元素:
let last = array.pop()
但是 通過pop的方式會改變陣列本身,所以一般不建議用。
0x01
無論試用上面那種方式,都感覺很繁瑣。 這就讓人羨慕python裡面的陣列操作,可以通過負索引的方式獲取最後一個元素,程式碼如下:
last = array[-1]
js裡面不支援負索引的方式。 不過es6新增了一個at方法,可以獲取陣列的指定索引的元素,並且支援負索引。負索引從後往前計算,-1表示最後一個,-2 表示倒數第二個,依此類推。
因此試用此方法獲取最後一個元素會變得簡單很多。程式碼如下:
let last = array.at(-1)
0x02
如果瀏覽器還不支援這個方法,可以Polyfill:
function at(n) {
// ToInteger() abstract op
n = Math.trunc(n) || 0;
// Allow negative indexing from the end
if (n < 0) n += this.length;
// OOB access is guaranteed to return undefined
if (n < 0 || n >= this.length) return undefined;
// Otherwise, this is just normal property access
return this[n];
}
const TypedArray = Reflect.getPrototypeOf(Int8Array);
for (const C of [Array, String, TypedArray]) {
Object.defineProperty(C.prototype, "at",
{ value: at,
writable: true,
enumerable: false,
configurable: true });
}
參考 https://github.com/tc39/propo...
0x03
如果對前端和視覺化感興趣,可以和我交流, 關注公號“ITMan彪叔” 可以獲取作者微訊號,及時收到更多有價值的文章。