成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JS 中的類數組對象如何轉換為數組?

開發 前端
今天說一下 JS 的類數組對象是什么,以及如何將類數組對象轉為數組。

大家好,我是前端西瓜哥,今天說一下 JS 的類數組對象是什么,以及如何將類數組對象轉為數組。

類數組對象是什么?

類數組對象,就是含有 length 屬性的對象,但這個對象不是數組。

通常來說還會有 0 ~ length-1 的屬性,結構表現上非常像一個數組。

const arrlike = {1:'a', 4: 'd', length: 9};
Array.isArray(arrlike) // false

從底層上來看,這個對象的原型鏈上沒有 Array.prototype,所以我們不能用 Array.prototype 上的 forEach、map 等數組特有的方法。

關于原型鏈,可以看我的這篇文章:《如何用原型鏈的方式實現一個 JS 繼承?》

如果強行給一個類數組對象使用 forEach 方法,會得到一個類型錯誤。

function f(a, b) {
arguments.forEach(item => console.log(item));
}
// Uncaught TypeError: arguments.forEach is not a function

除了手動創造的類數組對象,還有以下常見的類數組對象:

  • 普通數組中的 argument 對象。需要注意的是,箭頭函數中不存在這個對象。
  • 一些獲取 Dom 集合的方法,如 document.querySelectorAll()、document.getElementsByClassName、document.getElementsByTagName() 也會返回類數組對象。

下面看看我們有哪些將類數組轉換為數組的方法。

Array.prototyle.slice.call()

我們可以用 Array.prototyle.slice 內置方法。

Array.prototype.slice.call(obj);
[].slice.call(obj);

[] 空數組效果同 Array.prototype,因為空數組本身沒有 slice 方法,會走原型鏈拿到 Array.prototype 的方法。空數組寫法除了短一點沒有任何優點。

然后 call 來自 Function.prototype,可以使用一個指定的 this 值來調用一個函數,這里是 Array.prototype.slice。我們不給 slice 方法傳開始和結束位置參數,這樣就會默認取整個范圍。

slice 的迭代時會跳過不存在的索引屬性,所以你會看到 empty 的特殊值,和 undefined 還有點不同,你可以認為表示未被初始化。forEach、map 這些內置方法是會跳過它們不執行傳入的回調函數的。

一個例子:

const arrlike = {1:'a', 4: 'd', length: 9};
const arr = Array.prototype.slice.call(arrlike);
console.log(arr);


JS 中的類數組對象如何轉換為數組?

什么原理?

因為 slice 用于拷貝返回一個新的子數組,且只需要被操作的目標有 length 屬性就行了。

下面是 Array.prototype.slice 的核心實現,默認 start 和 end 都在 length 范圍內。

Array.prototype.mySlice = function(start, end) {
if (start == undefined) start = 0;
if (end == undefined) end = this.length;
const cloned = new Array(end - start);
for (let i = 0; i < cloned.length; i++) {
// 為了確保不存在的索引保持為 empty 值
if (i in this) {
cloned[i] = this[start + i];
}
}
return cloned;
}

你會發現,類數組對象替換掉這里的 this 后,能拷貝出一個真正數組。

Array.from()

ES6 新出的方法,可以將類數組對象或者是可迭代對象轉換為數組。

const arrlike = {1:'a', 4: 'd', length: 9};
arr = Array.from(arrlike);
console.log(arr);

JS 中的類數組對象如何轉換為數組?

和Array.prototyle.slice.call() 有點不同,不存在的索引的值被設置了 undefined。

如果一個對象,既是類數組對象,又是可迭代對象,Array.from() 方法會使用該對象的迭代器方法。

一般來說,調用 JS 的內置方法返回類數組對象同時是可迭代對象,我們通常喜歡用擴展運算符(...),更優雅。

const elCollection = document.getElementsByTagName('div');
const elArray = [...elCollection];

結尾

一般來說,我們在開發中遇到的類數組對象都是 JS 內置方法返回的,同時也是可迭代對象,我們一般都是用 [...arrlik] 擴展運算符,咻咻咻搞定。

如果類數組對象不是可迭代對象,可以使用Array.prototyle.slice.call() 和 Array.from()

前者會對不存在的索引維持為 empty,后者則是 undefined。我們可以認為基本差別不大,建議用 Array.from(),語義化更好些。

責任編輯:姜華 來源: 今日頭條
相關推薦

2025-01-09 09:14:44

2021-01-28 07:52:39

JS數組變量

2011-06-01 10:19:41

基類對象派生類對象

2023-12-05 07:59:08

JS小技巧數組對象去重

2021-02-22 08:19:49

js前端元素

2009-11-25 16:55:45

PHP函數explod

2020-11-26 08:12:24

JavaScript對象數組

2020-12-22 14:11:45

JS forEach()map()

2024-03-26 06:53:41

Python元組轉換JSON對象

2021-09-07 11:01:41

二叉搜索樹序數組

2020-11-11 10:09:06

Node.jsPromise前端

2016-08-03 17:23:47

javascripthtml前端

2010-03-15 12:36:26

Python列表

2022-10-12 08:00:00

語音識別Node.js音頻質量

2022-09-22 11:40:11

JavaScript數組開發

2010-01-05 17:59:46

PHP JSON數組對

2010-10-09 09:26:59

Array數組JS

2021-03-11 23:43:20

JavaScript數組開發

2021-03-18 10:45:02

JavaScript數組運算符

2022-05-19 09:01:08

TypeScript元組對象
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色婷婷av一区二区三区软件 | 91国产在线视频在线 | 久久人人爽人人爽 | 久久狠狠 | 免费一级毛片 | 污视频在线免费观看 | 高清久久久 | 理论片免费在线观看 | 国产传媒毛片精品视频第一次 | 久久久美女 | 国产精品视频一 | 黄色一级电影在线观看 | 一区二区在线看 | www.久| 久久高清精品 | 精品伦精品一区二区三区视频 | 亚洲精品视频在线看 | 国产精品入口麻豆www | 亚洲精品一区二区 | 午夜视频免费在线观看 | 精品在线一区 | 看av电影| 欧美一级片在线观看 | 国产精品日本一区二区不卡视频 | 久久婷婷av | 成人免费小视频 | 亚洲欧美日本国产 | 亚洲精品女人久久久 | 精品一区二区三区四区五区 | 久久精品小短片 | 欧美日韩大片 | 免费a网 | 草草草草视频 | 欧美激情一区二区三区 | 日韩电影免费在线观看中文字幕 | 91免费看片 | 亚洲国产中文字幕 | 欧美jizzhd精品欧美巨大免费 | av在线一区二区三区 | 国产精品永久久久久久久www | 精品一区二区三区入口 |