JavaScript中的偽數(shù)組用法及說明
JavaScript中的偽數(shù)組
1.什么是偽數(shù)組
JavaScript中存在有一種類數(shù)組,或者說偽數(shù)組。經(jīng)常見到的偽數(shù)組有函數(shù)的arguments對象、dom.querySelectorAll等獲取的NodeList類(NodeList本身具有forEach方法)等。
偽數(shù)組并不是數(shù)組,它沒有繼承Array.prototype,但是它“看起來像數(shù)組”,它本身沒有數(shù)組的標(biāo)準(zhǔn)方法,但是它可以復(fù)用這些標(biāo)準(zhǔn)方法。
例子
function arrayLike() {
? ? arguments.forEach(a => console.log(a));//TypeError: arguments.forEach is not a function
}
arrayLike(1, 2, 3);如上例所示,arguments對象本身并沒有forEach方法,但是它可以復(fù)用數(shù)組的這些標(biāo)準(zhǔn)方法。
例子
function arrayLike() {
? ? // arguments.forEach(a => console.log(a));
? ? [].forEach.call(arguments, a => console.log(a));// 1 2 3 通過call改變this指向,調(diào)用數(shù)組的方法
? ? [...arguments].forEach(a => console.log(a));// 1 2 3 ?構(gòu)建一個真實(shí)數(shù)組,然后調(diào)用數(shù)組的方法
}
arrayLike(1, 2, 3);2.如何創(chuàng)建一個偽數(shù)組對象
一個數(shù)組對象必然具有兩個特點(diǎn):
- 具有一個范圍在 0~232-1 的整型length屬性
- length屬性大于該對象的最大索引,索引是一個 0-232 -2 范圍內(nèi)的整數(shù)
所以很簡單,只要實(shí)現(xiàn)這兩個特點(diǎn),一個對象就是偽數(shù)組對象了。
例子
const arr = { 1: 'AAA', 3: 'CCC', length: 8, }; [].forEach.call(arr, (item, i) => console.log(item, i)); //AAA 1 CCC 33.數(shù)組的concat方法
對于數(shù)組和偽數(shù)組,在數(shù)組的標(biāo)準(zhǔn)方法中,只有concat方法是不通用的,對于一個偽數(shù)組,concat方法會將其作為一個整體連接起來。
例子
console.log([].concat.call(arr, [7, 8]));//[ { '1': 'AAA', '3': 'CCC', length: 8 }, 7, 8 ]
console.log([1, 2].concat([7, 8]));//[ 1, 2, 7, 8 ]上例展示了數(shù)組和偽數(shù)組調(diào)用concat的不同結(jié)果,在遇到這種情況時,我們只有自己對偽數(shù)組進(jìn)行轉(zhuǎn)換,比如:
1.通過slice方法,復(fù)制偽數(shù)組
console.log([].concat.call([].slice.call(arr), [7, 8])); //[ <1 empty item>, 'AAA', <1 empty item>, 'CCC', <4 empty items>, 7, 8 ]
2.通過Symbol.isConcatSpreadable改變對偽數(shù)組對象進(jìn)行concat操作時的默認(rèn)行為
const arr = {
? ? 1: 'AAA',
? ? 3: 'CCC',
? ? length: 8,
? ? [Symbol.isConcatSpreadable]: true,
};
console.log([].concat.call(arr, [7, 8]));
//[ <1 empty item>, 'AAA', <1 empty item>, 'CCC', <4 empty items>, 7, 8 ]JavaScript偽數(shù)組變真數(shù)組
首先介紹兩種非常簡單直接的方法(偽數(shù)組為可迭代對象):
[...偽數(shù)組] // ES6的語法糖,直接將偽數(shù)組(對象)變?yōu)檎鏀?shù)組 Array.from(偽數(shù)組) // Array中的靜態(tài)方法,直接將偽數(shù)組(對象)變?yōu)檎鏀?shù)組
下面講解偽數(shù)組和真數(shù)組的區(qū)別,還有利用數(shù)組的方法將偽數(shù)組變?yōu)檎鏀?shù)組:
偽數(shù)組與真數(shù)組的區(qū)別
- 偽數(shù)組是對象
- 偽數(shù)組原型是Object,而不是Array
- 所以偽數(shù)組沒有數(shù)組的方法,如push()、shift()、find()等等
- 偽數(shù)組的屬性名與數(shù)組的下標(biāo)相似,以0,1,2,… 等的數(shù)字表示,也擁有l(wèi)ength屬性
數(shù)組的方法對象能用的上嗎?==> 因?yàn)閿?shù)組的大部分方法是要遍歷數(shù)組,進(jìn)行處理再創(chuàng)建一個新數(shù)組放回的,而數(shù)組項(xiàng)的調(diào)用 arr[i] 這種形式對象也能用,所以偽數(shù)組這個對象能適應(yīng)部分?jǐn)?shù)組方法
偽數(shù)組是對象,那怎么利用數(shù)組的方法呢?==> 可以使用 [].數(shù)組方法.call(偽數(shù)組, 參數(shù)...) 或 [].數(shù)組方法.apply(偽數(shù)組, 參數(shù)) 來調(diào)用
所以利用偽數(shù)組與數(shù)組的相似點(diǎn)(屬性與下標(biāo)相似,擁有l(wèi)ength屬性,都可以用 [ ] 調(diào)用),可以很容易的利用數(shù)組的方法將偽數(shù)組變?yōu)檎鏀?shù)組。
// 下面我嘗試使用了數(shù)組中所以可能的方法,得出下列能將偽數(shù)組變?yōu)閿?shù)組的方法
// 函數(shù)中的 arguments 是存儲函數(shù)參數(shù)列表和特殊方法的對象,它是一個偽數(shù)組,我們將以它為例進(jìn)行嘗試
// 在實(shí)際應(yīng)用中,如果偽數(shù)組為可迭代對象,直接運(yùn)用前兩種最簡單的方法就夠了
function fun1(v1, v2, v3) {
?? ?console.log('-----------------arguments-------------------')
?? ?console.log(arguments) // Arguments { 0: 1, 1: 2, 2: 3, … }
?? ?console.log(Array.isArray(arguments)) // false
?? ?console.log('------------------------------------')
?? ?
?? ?let x = null ?// 定義變量x,接收偽數(shù)組轉(zhuǎn)化后的結(jié)果
?? ?
?? ?// 簡單方法(偽數(shù)組為可迭代對象)
?? ?x = [...arguments]
?? ?
?? ?x = Array.from(arguments)
?? ?
?? ?
?? ?// 調(diào)用數(shù)組方法
?? ?x = [].filter.call(arguments, v => true)
?? ?
?? ?x = [].map.call(arguments, v => v)
?? ?
?? ?x = [].slice.call(arguments)
?? ?// 上面各個方法調(diào)用后,成功將偽數(shù)組轉(zhuǎn)為真數(shù)組,其返回的真數(shù)組都是一樣的,如下
?? ?console.log(x) // Array(3) [ 1, 2, 3 ]
?? ?console.log(Array.isArray(x)) // true
}?
fun1(1, 2, 3)總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
- 關(guān)于javascript中偽數(shù)組和真數(shù)組的一些小秘密
- JS 將偽數(shù)組轉(zhuǎn)換成數(shù)組的實(shí)現(xiàn)示例
- JavaScript如何將偽數(shù)組轉(zhuǎn)換成數(shù)組?
- JavaScript偽數(shù)組和數(shù)組的使用與區(qū)別
- JS Array.from()將偽數(shù)組轉(zhuǎn)換成數(shù)組的方法示例
- JavaScript偽數(shù)組用法實(shí)例分析
- js中將HTMLCollection/NodeList/偽數(shù)組轉(zhuǎn)換成數(shù)組的代碼
- javascript 偽數(shù)組實(shí)現(xiàn)方法
相關(guān)文章
H5頁面跳轉(zhuǎn)小程序的3種實(shí)現(xiàn)方式
這篇文章主要給大家介紹了關(guān)于H5頁面跳轉(zhuǎn)小程序的3種實(shí)現(xiàn)方式,說出來你可能不信,每位商家?guī)缀醵紩5轉(zhuǎn)跳到小程序、H5轉(zhuǎn)跳至小程序的應(yīng)用范圍十分廣闊,需要的朋友可以參考下2023-08-08
使用 JScript 創(chuàng)建 .exe 或 .dll 文件的方法
JScript 是由微軟開發(fā)的活動腳本語言,基于 ECMAScript 規(guī)范實(shí)現(xiàn)。Internet Explorer 中的 JavaScript,實(shí)際上是指 JScript。2011-07-07
javascript for-in有序遍歷json數(shù)據(jù)并探討各個瀏覽器差異
這篇文章主要介紹了javascript for-in有序遍歷json數(shù)據(jù)并探討各個瀏覽器差異的相關(guān)資料,需要的朋友可以參考下2015-11-11
js原生跨域_用script標(biāo)簽的簡單實(shí)現(xiàn)
下面小編就為大家?guī)硪黄猨s原生跨域_用script標(biāo)簽的簡單實(shí)現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09
JavaScript Set與Map數(shù)據(jù)結(jié)構(gòu)詳細(xì)分析
大家心里是否產(chǎn)生過這樣的疑問,JS中既然已經(jīng)有對象這種數(shù)據(jù)結(jié)構(gòu),我們?yōu)槭裁催€要再單獨(dú)去使用Set或者M(jìn)ap呢?下面這篇文章主要給大家介紹了關(guān)于ES6中Set和Map數(shù)據(jù)結(jié)構(gòu)的相關(guān)資料,需要的朋友可以參考下2022-11-11

