<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
JavaScript中存在有一種類陣列,或者說偽陣列。經常見到的偽陣列有函數的arguments物件、dom.querySelectorAll等獲取的NodeList類(NodeList本身具有forEach方法)等。
偽陣列並不是陣列,它沒有繼承Array.prototype,但是它“看起來像陣列”,它本身沒有陣列的標準方法,但是它可以複用這些標準方法。
例子
function arrayLike() { arguments.forEach(a => console.log(a));//TypeError: arguments.forEach is not a function } arrayLike(1, 2, 3);
如上例所示,arguments物件本身並沒有forEach方法,但是它可以複用陣列的這些標準方法。
例子
function arrayLike() { // arguments.forEach(a => console.log(a)); [].forEach.call(arguments, a => console.log(a));// 1 2 3 通過call改變this指向,呼叫陣列的方法 [...arguments].forEach(a => console.log(a));// 1 2 3 構建一個真實陣列,然後呼叫陣列的方法 } arrayLike(1, 2, 3);
一個陣列物件必然具有兩個特點:
所以很簡單,只要實現這兩個特點,一個物件就是偽陣列物件了。
例子
const arr = { 1: 'AAA', 3: 'CCC', length: 8, }; [].forEach.call(arr, (item, i) => console.log(item, i)); //AAA 1 CCC 3
對於陣列和偽陣列,在陣列的標準方法中,只有concat方法是不通用的,對於一個偽陣列,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 ]
上例展示了陣列和偽陣列呼叫concat的不同結果,在遇到這種情況時,我們只有自己對偽陣列進行轉換,比如:
1.通過slice方法,複製偽陣列
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改變對偽陣列物件進行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 ]
首先介紹兩種非常簡單直接的方法(偽陣列為可迭代物件):
[...偽陣列] // ES6的語法糖,直接將偽陣列(物件)變為真陣列 Array.from(偽陣列) // Array中的靜態方法,直接將偽陣列(物件)變為真陣列
下面講解偽陣列和真陣列的區別,還有利用陣列的方法將偽陣列變為真陣列:
陣列的方法物件能用的上嗎?==> 因為陣列的大部分方法是要遍歷陣列,進行處理再建立一個新陣列放回的,而陣列項的呼叫 arr[i] 這種形式物件也能用,所以偽陣列這個物件能適應部分陣列方法
偽陣列是物件,那怎麼利用陣列的方法呢?==> 可以使用 [].陣列方法.call(偽陣列, 引數...) 或 [].陣列方法.apply(偽陣列, 引數) 來呼叫
所以利用偽陣列與陣列的相似點(屬性與下標相似,擁有length屬性,都可以用 [ ] 呼叫),可以很容易的利用陣列的方法將偽陣列變為真陣列。
// 下面我嘗試使用了陣列中所以可能的方法,得出下列能將偽陣列變為陣列的方法 // 函數中的 arguments 是儲存函數參數列和特殊方法的物件,它是一個偽陣列,我們將以它為例進行嘗試 // 在實際應用中,如果偽陣列為可迭代物件,直接運用前兩種最簡單的方法就夠了 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,接收偽陣列轉化後的結果 // 簡單方法(偽陣列為可迭代物件) x = [...arguments] x = Array.from(arguments) // 呼叫陣列方法 x = [].filter.call(arguments, v => true) x = [].map.call(arguments, v => v) x = [].slice.call(arguments) // 上面各個方法呼叫後,成功將偽陣列轉為真陣列,其返回的真陣列都是一樣的,如下 console.log(x) // Array(3) [ 1, 2, 3 ] console.log(Array.isArray(x)) // true } fun1(1, 2, 3)
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45