javascript中的偽(類)數(shù)組

1.什么是偽數(shù)組战转?

偽數(shù)組(ArrayLike)又稱類數(shù)組躬审,雖然從名字上來看枉证,貌似和數(shù)組很像矮男,但實(shí)際上和數(shù)組有很大區(qū)別:

  1. 偽數(shù)組是一個(gè)對(duì)象,所以 偽數(shù)組 instanceof Array===false 和 偽數(shù)組 instanceof Object===true 這兩個(gè)等式都成立
  2. 偽數(shù)組必須含有l(wèi)ength屬性室谚,且必須是 number 類型毡鉴,否則就不叫偽數(shù)組,就是一個(gè)普通對(duì)象而已
  3. 如果length不為0秒赤,那么必須要有數(shù)值型下標(biāo)(即0或者'0'都可以猪瞬,只要可以通過Number()轉(zhuǎn)換為數(shù)值即可)存儲(chǔ)的數(shù)據(jù)
  4. 偽數(shù)組不能調(diào)用數(shù)組原型上的方法。就是:xx.push()入篮、xx.slice()陈瘦、xx.indexOf() 等等這些方法都不能用

了解了偽數(shù)組的特點(diǎn)后,我們可以根據(jù)其特點(diǎn)舉幾個(gè)例子

2.舉個(gè)栗子

不是偽數(shù)組

var a = {};
var b = { length: 3 };

是偽數(shù)組

var c = { length: 0 };
var d = { 0: '888', length: 1 };
var e = { 1: 'abc', length: 3 }
var f = { '0': 'abc',1:'test', length: 3 }
var g = { 0: 'abc',2:'test', length: 1 }

我們打印下上面7個(gè)變量的結(jié)果如下:

20190911111001.png

3.偽數(shù)組轉(zhuǎn)數(shù)組

  1. 方法一:Array.prototype.slice.call(arrayLike) 或者 Array.prototype.slice.apply(arrayLike)潮售。

我們知道數(shù)組的slice方法可以對(duì)數(shù)組進(jìn)行切割(不傳參痊项,返回原數(shù)組),返回新數(shù)組酥诽。由于類數(shù)組并沒有數(shù)組的這些方法鞍泉,所以通過前面在javascript中的this指向講解過call的原理,我們可以借用方法肮帐。所以上面代碼的call函數(shù)原理是:

arrayLike.fn1=this //this指向slice
arrayLike.fn1()  //即arrayLike調(diào)用fn1也就是slice方法咖驮,所以slice方法中的this指向arrayLike。所以偽數(shù)組被切割成數(shù)組返回出來

Array.prototype上的方法原本只能用來操作array對(duì)象。但用call apply 可以把任意對(duì)象當(dāng)做this傳入某個(gè)方法托修,如此一來忘巧,方法中用到的this的地方就不再局限于原來規(guī)定的對(duì)象,而是得到更廣的適用性睦刃。

  1. 方法二:Array.prototype.splice.call(arrayLike, 0) 或者 Array.prototype.splice.call(arrayLike, 0)

splice也是數(shù)組的方法袋坑,對(duì)數(shù)組進(jìn)行切割(第一個(gè)參數(shù)為切割起始位置,必填)眯勾,我就不介紹了枣宫。和上面原理一樣。

  1. 方法三:Array.prototype.concat.apply([], arrayLike)
  1. 方法四:使用es6自帶的Array.from(arrayLike)方法

4.使用上面轉(zhuǎn)換方法測(cè)試

上面我們舉了幾個(gè)偽數(shù)組的例子以及如何將偽數(shù)組轉(zhuǎn)換為數(shù)組吃环,現(xiàn)在我們對(duì)這些例子進(jìn)行測(cè)試:

1.使用 Array.prototype.slice.call(arrayLike)

注:splice我就不舉列子也颤,和slice一樣。

var translate=function(arrayLike){
    return Array.prototype.slice.call(arrayLike)
}
console.log(translate(c),translate(c)[0],translate(c).length);
console.log(translate(d),translate(d)[0],translate(d).length);
console.log(translate(e),translate(e)[0],translate(e).length);
console.log(translate(f),translate(f)[2],translate(f).length);
console.log(translate(g),translate(g)[1],translate(g).length);

運(yùn)行結(jié)果如下:

20190911111500.png

2.使用 Array.prototype.concat.apply([], arrayLike) 方法

var translate=function(arrayLike){
    return Array.prototype.concat.apply([], arrayLike)
}
console.log(translate(c),translate(c)[0],translate(c).length);
console.log(translate(d),translate(d)[0],translate(d).length);
console.log(translate(e),translate(e)[0],translate(e).length);
console.log(translate(f),translate(f)[2],translate(f).length);
console.log(translate(g),translate(g)[1],translate(g).length);

運(yùn)行結(jié)果如下:

20190911111537.png

3.使用 Array.from(arrayLike) 方法

var translate=function(arrayLike){
    return Array.from(arrayLike)
}
console.log(translate(c),translate(c)[0],translate(c).length);
console.log(translate(d),translate(d)[0],translate(d).length);
console.log(translate(e),translate(e)[0],translate(e).length);
console.log(translate(f),translate(f)[2],translate(f).length);
console.log(translate(g),translate(g)[1],translate(g).length);

運(yùn)行結(jié)果如下:

20190911111303.png

5.對(duì)比

上面測(cè)試結(jié)果:

  1. 從打印表面上看郁轻,Array.prototype.concat.apply([], arrayLike)Array.from(arrayLike)所有輸出結(jié)果都一樣翅娶,而Array.prototype.slice.call(arrayLike)結(jié)果有些許差別
  2. 如果類數(shù)組length值和所含數(shù)據(jù)個(gè)數(shù)相等,三個(gè)方法結(jié)果都一樣
  3. 如果類數(shù)組length值大于所含數(shù)據(jù)個(gè)數(shù)好唯,slice將所缺失的用empty來補(bǔ)充竭沫,contact和from用undefined來補(bǔ)充。但是打印缺失的都為undefined骑篙,所以三者只是從形式上有區(qū)別蜕提,使用沒什么區(qū)別
  4. 如果類數(shù)組length值小于所含數(shù)據(jù)個(gè)數(shù),三個(gè)方法都會(huì)將多余的裁減掉靶端。

6.常見的類數(shù)組對(duì)象

1.arguments對(duì)象

arguments對(duì)象是所有(非箭頭)函數(shù)中都可用的局部變量谎势。你可以使用arguments對(duì)象在函數(shù)中引用函數(shù)的參數(shù)。arguments對(duì)象不是一個(gè)Array杨名。它類似于Array脏榆,但除了length屬性和索引元素之外沒有任何Array屬性。例如台谍,它沒有pop方法须喂。但它可以被轉(zhuǎn)換為一個(gè)真正的Array。

function foo(a, b, c) {
    console.log(arguments);
}

foo(1, 2, 3);

打印結(jié)果如下:

20190911115414.png

2.jquery對(duì)象

//html
<p>1</p>
<p>2</p>
<p>3</p>

//js
console.log($('p'))
20190911115921.png

3.js獲取dom節(jié)點(diǎn)的方法趁蕊,如getElementById等

 //html
<p>1</p>
<p>2</p>
<p>3</p>

//js
console.log('通過querySelectorAll:',document.querySelectorAll("p"))

console.log('通過getElementsByTagName:',document.getElementsByTagName("p"))

20190911120433.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坞生,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子介衔,更是在濱河造成了極大的恐慌恨胚,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炎咖,死亡現(xiàn)場(chǎng)離奇詭異赃泡,居然都是意外死亡寒波,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門升熊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俄烁,“玉大人,你說我怎么就攤上這事级野∫惩溃” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵蓖柔,是天一觀的道長(zhǎng)辰企。 經(jīng)常有香客問我,道長(zhǎng)况鸣,這世上最難降的妖魔是什么牢贸? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮镐捧,結(jié)果婚禮上潜索,老公的妹妹穿的比我還像新娘。我一直安慰自己懂酱,他們只是感情好竹习,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著列牺,像睡著了一般整陌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昔园,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天蔓榄,我揣著相機(jī)與錄音并炮,去河邊找鬼默刚。 笑死好渠,一個(gè)胖子當(dāng)著我的面吹牛蹄殃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播退敦,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼伍俘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼邪锌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起癌瘾,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤觅丰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后妨退,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妇萄,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜕企,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了冠句。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轻掩。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖懦底,靈堂內(nèi)的尸體忽然破棺而出唇牧,到底是詐尸還是另有隱情,我是刑警寧澤聚唐,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布丐重,位于F島的核電站,受9級(jí)特大地震影響杆查,放射性物質(zhì)發(fā)生泄漏弥臼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一根灯、第九天 我趴在偏房一處隱蔽的房頂上張望径缅。 院中可真熱鬧,春花似錦烙肺、人聲如沸纳猪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氏堤。三九已至,卻和暖如春搏明,著一層夾襖步出監(jiān)牢的瞬間鼠锈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工星著, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留购笆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓虚循,卻偏偏與公主長(zhǎng)得像同欠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子横缔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容