JavaScript,,通過分析Array.prototype.push重新認(rèn)識(shí)Array在閱讀ECMAScript的文檔的時(shí)候,,有注意到它說,數(shù)組的push方法其實(shí)不僅限于在數(shù)組中使用,,專門留作通用方法,。難道是說,在一些類數(shù)組的地方也可以使用,?而哪些是和數(shù)組非常相像的呢,,大家或許一下子就可以想到就是Object對(duì)象。因?yàn)锳rray就是繼承自O(shè)bject的,,可以用 [] instanceof Object,,會(huì)發(fā)現(xiàn)返回的是true。當(dāng)然大家都知道,,這也不是什么新鮮事,。那我們可以大膽嘗試一下,如果我們將數(shù)組的push方法應(yīng)用在對(duì)象上,,會(huì)一個(gè)怎么樣的表現(xiàn)呢,?
我們通過call,將this的值指向了obj,,然后進(jìn)行push,。可以發(fā)現(xiàn),,obj對(duì)象里多了一個(gè) '0': 'zero'和數(shù)組的'length'屬性,!我們都知道,一般對(duì)象是沒有l(wèi)ength屬性的,,所以當(dāng)我們要知道Object有多少個(gè)屬性時(shí),,一般都要用for in來進(jìn)行對(duì)象迭代。那可以知道,,這個(gè)length屬性則是由Array.prototype.push這個(gè)方法,,內(nèi)部傳進(jìn)去的。為了接近我們的想法,我們可以繼續(xù)實(shí)驗(yàn),。
這一次我們自己傳入了一個(gè)length值,我們可以看得出,,push方法是根據(jù)length的值來為key命名的,,大致思路應(yīng)該如下?! ?/p>
其實(shí)JavaScript數(shù)組的數(shù)據(jù)結(jié)構(gòu)就是棧,,遵循著“后進(jìn)先出”,當(dāng)然這個(gè)length-1也就充當(dāng)著top這個(gè)角色啦,!當(dāng)然如果我們要使用push進(jìn)去的屬性,,我們就要使用方括號(hào)的形式[],因?yàn)辄c(diǎn)符號(hào)是不能直接接上數(shù)字的,。所以就成了 obj[0] == 'zero',。這乍一看!尼瑪,,這不就是數(shù)組么,,喲,只是長(zhǎng)得像而已~~畢竟Array.prototype里的方法可豐富多啦,。特別是ECMAScript新增的各種數(shù)組迭代方法,,forEach, map,some,reduce之類的,簡(jiǎn)直好用到不行,,特別是最近發(fā)掘的reduce,,可以配合之前剛剛探討過的遞歸算法使用,簡(jiǎn)直開發(fā)利器,。有時(shí)間我會(huì)專門說一下reduce該如何使用,!
分類: JavaScript
0
0
(請(qǐng)您對(duì)文章做出評(píng)價(jià))
|
|