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ù)組的標準方法,但是它可以復(fù)用這些標準方法。
例子
function arrayLike() { ? ? arguments.forEach(a => console.log(a));//TypeError: arguments.forEach is not a function } arrayLike(1, 2, 3);
如上例所示,arguments對象本身并沒有forEach方法,但是它可以復(fù)用數(shù)組的這些標準方法。
例子
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ù)組,然后調(diào)用數(shù)組的方法 } arrayLike(1, 2, 3);
2.如何創(chuàng)建一個偽數(shù)組對象
一個數(shù)組對象必然具有兩個特點:
- 具有一個范圍在 0~232-1 的整型length屬性
- length屬性大于該對象的最大索引,索引是一個 0-232 -2 范圍內(nèi)的整數(shù)
所以很簡單,只要實現(xiàn)這兩個特點,一個對象就是偽數(shù)組對象了。
例子
const arr = { 1: 'AAA', 3: 'CCC', length: 8, }; [].forEach.call(arr, (item, i) => console.log(item, i)); //AAA 1 CCC 3
3.數(shù)組的concat方法
對于數(shù)組和偽數(shù)組,在數(shù)組的標準方法中,只有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ù)組進行轉(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ù)組對象進行concat操作時的默認行為
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ù)組的下標相似,以0,1,2,… 等的數(shù)字表示,也擁有l(wèi)ength屬性
數(shù)組的方法對象能用的上嗎?==> 因為數(shù)組的大部分方法是要遍歷數(shù)組,進行處理再創(chuàng)建一個新數(shù)組放回的,而數(shù)組項的調(diào)用 arr[i] 這種形式對象也能用,所以偽數(shù)組這個對象能適應(yīng)部分數(shù)組方法
偽數(shù)組是對象,那怎么利用數(shù)組的方法呢?==> 可以使用 [].數(shù)組方法.call(偽數(shù)組, 參數(shù)...) 或 [].數(shù)組方法.apply(偽數(shù)組, 參數(shù)) 來調(diào)用
所以利用偽數(shù)組與數(shù)組的相似點(屬性與下標相似,擁有l(wèi)ength屬性,都可以用 [ ] 調(diào)用),可以很容易的利用數(shù)組的方法將偽數(shù)組變?yōu)檎鏀?shù)組。
// 下面我嘗試使用了數(shù)組中所以可能的方法,得出下列能將偽數(shù)組變?yōu)閿?shù)組的方法 // 函數(shù)中的 arguments 是存儲函數(shù)參數(shù)列表和特殊方法的對象,它是一個偽數(shù)組,我們將以它為例進行嘗試 // 在實際應(yīng)用中,如果偽數(shù)組為可迭代對象,直接運用前兩種最簡單的方法就夠了 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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- 關(guān)于javascript中偽數(shù)組和真數(shù)組的一些小秘密
- JS 將偽數(shù)組轉(zhuǎn)換成數(shù)組的實現(xiàn)示例
- JavaScript如何將偽數(shù)組轉(zhuǎn)換成數(shù)組?
- JavaScript偽數(shù)組和數(shù)組的使用與區(qū)別
- JS Array.from()將偽數(shù)組轉(zhuǎn)換成數(shù)組的方法示例
- JavaScript偽數(shù)組用法實例分析
- js中將HTMLCollection/NodeList/偽數(shù)組轉(zhuǎn)換成數(shù)組的代碼
- javascript 偽數(shù)組實現(xiàn)方法
相關(guān)文章
JavaScript實現(xiàn)三級級聯(lián)特效
這篇文章主要介紹了JavaScript實現(xiàn)三級級聯(lián)特效,選擇省會出現(xiàn)相應(yīng)的縣下拉框,同時市的下拉框改變,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11js簡單實現(xiàn)HTML標簽Select聯(lián)動帶跳轉(zhuǎn)
Select聯(lián)動帶跳轉(zhuǎn)的效果想必大家并不陌生吧,下面有個不錯的示例,感興趣的朋友可以參考下2013-10-10使用js檢測瀏覽器是否支持html5中的video標簽的方法
這篇文章主要介紹了使用js檢測瀏覽器是否支持html5中的video標簽的方法,需要的朋友可以參考下2014-03-03