jQuery.makeArray(obj)這個函數從名字來看很容易猜出它的用途:應該是用來將傳入的物件轉換成一個原生array
再看看官網上對它的解釋:Convert an array-like object into a true JavaScript array.(將一個類似數組物件轉換為JS原生的數組)
那麼怎麼樣的object才可以稱為" array-like object"呢?這個問題不急著回答,相信看完文章你會明白的,先看看下面的實驗
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>jQuery.makeArray demo</title> <style> p { color: red; } </style> <script src="//code.jquery.com/jquery-1.10.2.js"></script> </head> <body> <p> First </p> <p> Second </p> <p> Third </p> <p> Fourth </p> <script> // Returns a NodeList var elems = document.getElementsByTagName("p"); // Convert the NodeList to an Array var arr = jQuery.makeArray(elems); // Use an Array method on list of dom elements arr.reverse(); $(arr).appendTo(document.body); </script> </body> </html>
這裡可以看到在chrome中通過document .getElementsByTagName("p")回傳的是一個HTMLCollection
而非官網上所說的NodeList,特意去找了NodeList和HTMLCollection的區別:HTMLCollection 物件和 NodeList 物件很相似,但前者可能既能用名稱索引也能用數字索引,而後者只能用數字索引來存取(當然NodeList也是“array-like object”)
經過實驗發現elems可以用名稱和陣列來索引,結論:在chrome中透過document.getElementsByTagName("p")傳回的是一個HTMLCollection
HTMLCollection可以透過elems.length取得它的長度,並且可以透過elems[ 0]這樣的方式來存取其中的元素
像是不像陣列的存取方式?其實它就是就一個“Array-like object”,但它不是js的原生數組,所以無法存取array的native方法,例如(.pop() #and .reverse())
而後面透過jQuery.makeArray(elems)轉換就得到了原生的JS數組arr,接下來就可以使用array的native方法了!
除了HTMLCollection,還可以轉換什麼呢?聽過jQuery包裹的陣列這麼一個玩意兒嗎?
不過肯定接觸過,例如透過$('p')得到一組p,這一組p就是一個jQuery包裹的陣列
又比如,透過.map( )函數得到的也是一個jQuery包裹的數組,也可以length來得到長度,並通過下標索引來訪問,並且jQuery包裹的數組還可以使用jQuery提供的方法。
可以透過$.makeArray(obj)來轉換成原生Array,例如最常見的在.map()函數中得到jQuery數組之後轉換成原生array再透過join()得到結果
當然,將jQuery包裹的陣列轉換成原生數組的方法不只這一種,常見的還有.get()和.toArray()
這一種情況稍微複雜一點,因為json物件本來不是“array-like object”,所以我們需要一種轉換
還記得之前我們說的幾種“array-like object”嗎?它們都可以透過.length來得到長度,並且可以透過下標索引來訪問,例如:fakeArr.length、fakeArr[0]
那麼我們是否可以透過讓json支持這樣的方式來將它變成「array-like object」呢?
先設計:
要讓json支援fakeArr.length,簡單,只需要定義一個key為length的鍵值對就OK了
而支援下標存取似乎也可以迎刃而解,另外鍵值對都使用數字來當key就好了~
那麼試試看:
var fakeArray = {0: "张三", 1: "李四", 2:"朱六", length:3}; var realArray = $.makeArray(fakeArray); console.log(fakeArray) console.log(realArray) realArray.reverse(); console.log(realArray);
看到了嗎?成功了!這裡的realArray已經是js的原生array了,所以可以使用reverse()等native方法
#要注意的是,轉換過程中length很重要,這個length也就是決定了轉換後array的length
若將上述例子中的length指定為2,那麼轉換後的陣列只有前2個元素,也就是["張三", "李四"]
若將上述例子中的length指定為4,那麼轉換後的數組並不會是我們希望的數組,而是類似於new Array().push(fakeArray) 這樣一個數組
以上是jQuery中.makeArray()如何實作將多種型別轉換成JS原生Array的實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!