標籤:js javascript jquery
jQuery.makeArray(obj)這個函數從名字上來看很容易猜出它的用途:應該是用來將傳入的對象轉換成一個原生array
再看看官網上對它的解釋:Convert an array-like object into a true JavaScript array.(將一個類似數組對象轉換為JS原生的數組)
那麼怎麼樣的object才可以稱為"array-like object"呢?這個問題不急著回答,相信看完文章你會明白的,先看看下面的實驗
將HTMLCollection轉換成原生Array
<!doctype html><html lang="en"><head><meta charset="utf-8"><title>jQuery.makeArray demo</title><style>div {color: red;}</style><script src="//code.jquery.com/jquery-1.10.2.js"></script></head><body><div> First </div> <div> Second </div> <div> Third </div> <div> Fourth </div><script>// Returns a NodeListvar elems = document.getElementsByTagName("div");// Convert the NodeList to an Arrayvar arr = jQuery.makeArray(elems);// Use an Array method on list of dom elementsarr.reverse();$(arr).appendTo(document.body);</script></body></html>
這裡可以看到在chrome中通過document.getElementsByTagName("div")返回的是一個HTMLCollection
而非官網上所說的NodeList,特意去找了NodeList和HTMLCollection的區別:HTMLCollection 對象和 NodeList 對象很相似,但前者可能既能用名稱索引也能用數字索引,而後者只能用數字索引來訪問(當然NodeList也是“array-like object”)
經過實驗發現elems可以通過名稱和數組來索引,結論:在chrome中通過document.getElementsByTagName("div")返回的是一個HTMLCollection
HTMLCollection可以通過elems.length擷取它的長度,並且可以通過elems[0]這樣的方式來訪問其中的元素
像不像數組的訪問方式?其實它就是就一個“Array-like object”,但是它並不是js的原生數組,所以無法訪問array的native方法,比如(.pop() and .reverse())
而後面通過jQuery.makeArray(elems)轉換就得到了原生的JS數組arr,接下來就可以使用array的native方法了!
將jQuery包裹的數群組轉換成原生Array
除了HTMLCollection,還可以轉換什麼呢?聽說過jQuery包裹的數組這麼一個玩意兒嗎?
不過肯定接觸過,比如通過$(‘div‘)得到一組div,這一組div就是一個jQuery包裹的數組
又比如,通過.map()函數得到的也是一個jQuery包裹的數組,也可以length來得到長度,並通過下標索引來訪問,並且jQuery包裹的數組還可以使用jQuery提供的方法。
可以通過$.makeArray(obj)來轉換成原生Array,比如最常見的在.map()函數中得到jQuery數組之後轉換成原生array再通過join()得到結果
當然,將jQuery包裹的數群組轉換成原生數組的方法不止這一種,常見的還有.get()和.toArray()
將json對象轉換成原生Array
這一種情況稍微複雜一點,因為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