ES6中的數(shù)組擴(kuò)展方法
form 轉(zhuǎn)化為真正的數(shù)組
先說(shuō)一下使用場(chǎng)景,在Js中,我們要經(jīng)常操作DOM,比如獲取全部頁(yè)面的input標(biāo)簽,并且找到類型為button的元素,然后給這個(gè)按鈕注冊(cè)一個(gè)點(diǎn)擊事件,我們可能會(huì)這樣操作;
var inputObjs=document.getElementsByTagName('input'); for(var i=0;i<inputObjs.length;i++){ if(inputObjs[i].type==='button'){ inputObjs[i].onclick=function(){ return; } } }
這樣寫(xiě)肯定是沒(méi)有問(wèn)題的,但是我們知道很多操作數(shù)組的方法比f(wàn)or循環(huán)好用多了,比如es5的forEach方法就很好用;但是能直接用嗎?不能!因?yàn)閐om對(duì)象集合不是一個(gè)真正得Array數(shù)組類型,直接使用會(huì)報(bào)錯(cuò)的;
var inputObjs=document.getElementsByTagName('input'); inputObjs.forEach(); //inputObjs.forEach is not a function
盡管如此我們還是可以用,不能直接用可以間接用,使用js強(qiáng)大的對(duì)象冒充功能即可;
var inputObjs=document.getElementsByTagName('input'); console.info(inputObjs); //[]length: 0__proto__: HTMLCollection console.info([].slice.call(inputObjs)); //[]length: 0__proto__: Array[0]
這樣轉(zhuǎn)化為真正的數(shù)組之后就可以隨便調(diào)用數(shù)組的方法啦;這種方法固然可行,但是不太容易理解而且太過(guò)于“曲折”,es6給我們提供了一個(gè)更為簡(jiǎn)單直接的方法,form,使用起來(lái)很簡(jiǎn)單:
var inputObjs=document.getElementsByTagName('input'); console.info(inputObjs); //[]length: 0__proto__: HTMLCollection console.info(Array.from(inputObjs)); //[]length: 0__proto__: Array[0]
結(jié)果是一樣的但是語(yǔ)義上更加貼切也更容易理解,是不是很好用??!當(dāng)然這些還不夠,不僅僅是類數(shù)組任何數(shù)據(jù)類型都能使用此方法轉(zhuǎn)化為數(shù)組,但是不同的類型效果是不一樣的,測(cè)試如下:
let str='google'; console.log(Array.from(str)); //["g", "o", "o", "g", "l", "e"] let num=234; console.log(Array.from(num)); //[] let bol=false; console.log(Array.from(bol)); let obj={foo:'foo',bar:'bar'}; console.log(Array.from(obj)); //[] let superObj={0:'foo',1:'bar',length:2}; console.log(Array.from(superObj)); //["foo", "bar"]
這里列出了不同的數(shù)據(jù)類型調(diào)用該方法后的結(jié)果,值得留意的是字符串和一些特殊對(duì)象是可以轉(zhuǎn)化為有內(nèi)容的數(shù)組的,特殊的對(duì)象是指內(nèi)容按照數(shù)字鍵值對(duì)排列,并且有l(wèi)ength屬性的對(duì)象;這種對(duì)象是可以使用for循環(huán)的,而字符串也是可以使用for循環(huán)來(lái)得到每一個(gè)字符的,所以歸結(jié)為一句話,能使用for循環(huán)輸出內(nèi)容的使用from方法就不是一個(gè)空數(shù)組;在這里提醒一下,使用過(guò)jQuery的小伙伴可以留意一下,當(dāng)你使用選擇器選擇元素返回的jquery對(duì)象是什么結(jié)構(gòu)的?其實(shí)就是我們例子中最后一個(gè)的結(jié)構(gòu),具體可以參考我的jQuery源碼分析系列文章
of 將值轉(zhuǎn)化為數(shù)組
創(chuàng)建數(shù)組有兩種方法一種是構(gòu)造函數(shù)式:
let arr=Array(1,2,3);
另一種是最常用的字面量創(chuàng)建:
let arr=[1,2,3];
Array.of方法其實(shí)是對(duì)第一個(gè)種方式的補(bǔ)充,用法如下:
console.log(Array.of(1,2,3)); //[1,2,3]
貌似跟跟構(gòu)造方法一樣的效果,那這個(gè)方法為什么還有存在的必要呢?看下面的例子就明白了:
console.log(Array()); //[] console.log(Array(1)); //[undefined] console.log(Array(1,2)); //[1,2]
在這個(gè)例子中參數(shù)數(shù)量的不同其代表的意義不一樣,只有一個(gè)參數(shù)時(shí),參數(shù)表示的是長(zhǎng)度,大于1一個(gè)參數(shù)時(shí)表示的元素,會(huì)引起混淆,但是Array.of方法就不會(huì)存在此問(wèn)題嗎,因?yàn)槠鋮?shù)始終表示的元素:
console.log(Array.of()); //[] console.log(Array.of(1)); //[1] console.log(Array.of(1,2)); //[1,2]
copyWithin 數(shù)組內(nèi)部數(shù)據(jù)復(fù)制替換
copyWithin方法主要作用是數(shù)組內(nèi)部值的替換,該方法接受三個(gè)參數(shù),分別表示開(kāi)始復(fù)制位置、結(jié)束復(fù)制位置和插入位置,示例如下:
[1, 2, 3, 4, 5].copyWithin(0, 3) // [4, 5, 3, 4, 5]// 將3號(hào)位復(fù)制到0號(hào)位 [1, 2, 3, 4, 5].copyWithin(0, 3, 4) // [4, 2, 3, 4, 5] // -2相當(dāng)于3號(hào)位,-1相當(dāng)于4號(hào)位 [1, 2, 3, 4, 5].copyWithin(0, -2, -1) // [4, 2, 3, 4, 5] // 將3號(hào)位復(fù)制到0號(hào)位 [].copyWithin.call({length: 5, 3: 1}, 0, 3) // {0: 1, 3: 1, length: 5} // 將2號(hào)位到數(shù)組結(jié)束,復(fù)制到0號(hào)位 var i32a = new Int32Array([1, 2, 3, 4, 5]); i32a.copyWithin(0, 2); // Int32Array [3, 4, 5, 4, 5] // 對(duì)于沒(méi)有部署TypedArray的copyWithin方法的平臺(tái) // 需要采用下面的寫(xiě)法 [].copyWithin.call(new Int32Array([1, 2, 3, 4, 5]), 0, 3, 4); // Int32Array [4, 2, 3, 4, 5]
以上所述是小編給大家介紹的ES6中的數(shù)組擴(kuò)展方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
JavaScript設(shè)計(jì)模式之觀察者模式與發(fā)布訂閱模式詳解
這篇文章主要介紹了JavaScript設(shè)計(jì)模式之觀察者模式與發(fā)布訂閱模式,結(jié)合實(shí)例形式詳細(xì)分析了JavaScript觀察者模式與發(fā)布訂閱模式相關(guān)概念、原理2020-05-05JavaScript仿flash遮罩動(dòng)畫(huà)效果
這篇文章主要為大家詳細(xì)介紹了JavaScript仿flash遮罩動(dòng)畫(huà)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06基于js實(shí)現(xiàn)二級(jí)下拉聯(lián)動(dòng)
這篇文章主要為大家詳細(xì)介紹了基于js實(shí)現(xiàn)二級(jí)下拉聯(lián)動(dòng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12使用InstantClick.js讓頁(yè)面提前加載200ms
本篇文章主要介紹了使用InstantClick.js讓頁(yè)面提前加載200ms,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09javascript實(shí)現(xiàn)炫酷的拖動(dòng)分頁(yè)
非??岬膉avascript拖動(dòng)分頁(yè)功能,無(wú)縫循環(huán)分頁(yè),拖動(dòng)鼠標(biāo)即可完成分頁(yè),鼠標(biāo)向左拖動(dòng)回到前一頁(yè),向右拖動(dòng)則翻開(kāi)第二頁(yè),還帶有動(dòng)畫(huà)特效,著實(shí)很不錯(cuò),界面黑色,非主流風(fēng)格,相信很多人會(huì)喜歡的。2015-05-05JS表示Stack類練習(xí)用棧實(shí)現(xiàn)任意進(jìn)制轉(zhuǎn)換
這篇文章主要為大家介紹了JS表示Stack類練習(xí)用棧實(shí)現(xiàn)任意進(jìn)制轉(zhuǎn)換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04詳解Javascript中document.execCommand()的用法以及指令參數(shù)列表
execCommand方法是執(zhí)行一個(gè)對(duì)當(dāng)前文檔,當(dāng)前選擇或者給出范圍的命令。在HTML5中,execCommand可以通過(guò)JavaScript代碼來(lái)調(diào)用,使得開(kāi)發(fā)者可以在網(wǎng)頁(yè)中實(shí)現(xiàn)一些復(fù)雜的文本操作。在HTML編輯器中這個(gè)命令用得很多,酷炫的強(qiáng)大功能。2023-07-07JavaScript實(shí)現(xiàn)左右滾動(dòng)電影畫(huà)布
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)左右滾動(dòng)電影畫(huà)布,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02