摘要:所以我說的這些類數(shù)組對(duì)象是什么它們有一些,其中包括是一個(gè)很特殊的變量,你再所有函數(shù)體內(nèi)都可以訪問到。讓類數(shù)組對(duì)象成為一個(gè)數(shù)組當(dāng)然這個(gè)標(biāo)題是不太準(zhǔn)確的,假如我們需要將這些類數(shù)組對(duì)象變成數(shù)組一樣,我們需要建立一個(gè)新的數(shù)組。
它看起來像是一個(gè)數(shù)組,而且它有一個(gè)length屬性,然而它并不是一個(gè)數(shù)組。JavaScript有時(shí)候是一門很怪異的語(yǔ)言,因?yàn)槟愫茈y定義一個(gè)數(shù)組的概念而沒有什么例外的。
所以我說的這些類數(shù)組對(duì)象是什么?它們有一些,其中包括arguments,arguments是一個(gè)很特殊的變量,你再所有函數(shù)體內(nèi)都可以訪問到。
假如你在一個(gè)工具(firebug)中檢查arguments這個(gè)變量,你會(huì)注意到它打印出來像是一個(gè)數(shù)組。它有按次序排列的元素,還有一個(gè)length屬性。
var testFunction = function() { console.log(arguments); console.log(arguments.length); };
所以我在抱怨什么?嘗試arguments.shift(),報(bào)錯(cuò)顯示arguments.shift() isn"t a function,但是shift()是數(shù)組的一個(gè)函數(shù)。嘗試console.log(arguments.constructor),它會(huì)打印Object(),同時(shí)假如你輸入的是[].constructor,它會(huì)打印Array[]。這是不是很奇怪?
這當(dāng)然不僅局限于arguments,看起來很多DOM集合都會(huì)返回這種對(duì)象,例如document.getElementsByTagName(), document.images, document.childNodes.在某些情況下,這些類似數(shù)組的更適合轉(zhuǎn)變?yōu)橐粋€(gè)數(shù)組。
當(dāng)然這個(gè)標(biāo)題是不太準(zhǔn)確的,假如我們需要將這些類數(shù)組對(duì)象變成數(shù)組一樣,我們需要建立一個(gè)新的數(shù)組。
var testFunction = function() { // Create a new array from the contents of arguments var args = Array.prototype.slice.call(arguments); var a = args.shift(); console.log("The first argument is: %s", a); // send the remaining arguments to some other function someOtherFunction(args); };
顯然,關(guān)鍵的地方在Array.prototype.slice.call(arguments),拆開它仔細(xì)每個(gè)部分。
Array 這是我們想要的base object的名稱
prototype 這可以被認(rèn)為是一個(gè)數(shù)組實(shí)例方法的命名空間
slice 提取一個(gè)數(shù)組的一部分,并返回一個(gè)新的數(shù)組,沒有一個(gè)開始和結(jié)束索引,它只返回?cái)?shù)組的副本.
call 這是一個(gè)非常有用的函數(shù),允許你在調(diào)用一個(gè)對(duì)象的函數(shù),然后在另一個(gè)函數(shù)的上下文中使用
另一個(gè)方面,如果你曾經(jīng)使用原型框架,你可以通過$A()轉(zhuǎn)化這些類數(shù)組對(duì)象成為數(shù)組。
談到$A,如果你不喜歡打上面那么長(zhǎng)的字符串代碼,并且你不使用Prototype。然后,你可以創(chuàng)建一條捷徑,就像Prototype folks:
var $A = function(obj) { return Array.prototype.slice.call(obj); }; // Example usage: $A(document.getElementsByTagName("li"));
原文地址:Array-like Objects in JavaScript
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/86425.html
摘要:本文將會(huì)深入分析的引擎的內(nèi)部實(shí)現(xiàn)。該引擎使用在谷歌瀏覽器內(nèi)部。同其他現(xiàn)代引擎如或所做的一樣,通過實(shí)現(xiàn)即時(shí)編譯器在執(zhí)行時(shí)將代碼編譯成機(jī)器代碼。這可使正常執(zhí)行期間只發(fā)生相當(dāng)短的暫停。 原文 How JavaScript works: inside the V8 engine + 5 tips on how to write optimized code 幾周前我們開始了一個(gè)系列博文旨在深入...
摘要:引擎可以是一個(gè)標(biāo)準(zhǔn)的解釋器,也可以是一個(gè)將編譯成某種形式的字節(jié)碼的即時(shí)編譯器。和其他引擎最主要的差別在于,不會(huì)生成任何字節(jié)碼或是中間代碼。不使用中間字節(jié)碼的表示方式,就沒有必要用解釋器了。 原文地址:https://blog.sessionstack.com... showImg(https://segmentfault.com/img/bVVwZ8?w=395&h=395); 數(shù)周之...
摘要:至于,其只是以數(shù)組的方傳入?yún)?shù),其它部分是一樣的,如下它們也可用于在中的類繼承中,調(diào)用父級(jí)構(gòu)造器。間接調(diào)用,調(diào)用了父級(jí)構(gòu)造器對(duì)比方法和,它倆都立即執(zhí)行了函數(shù),而函數(shù)返回了一個(gè)新方法,綁定了預(yù)先指定好的,并可以延后調(diào)用。 其實(shí)this是一個(gè)老生常談的問題了。關(guān)于this的文章非常多,其實(shí)我本以為自己早弄明白了它,不過昨天在做項(xiàng)目的過程中,還是出現(xiàn)了一絲疑惑,想到大概之前在JavaScri...
摘要:本系列的第一篇文章著重提供一個(gè)關(guān)于引擎運(yùn)行時(shí)和調(diào)用棧的概述。在硬件層面,計(jì)算機(jī)內(nèi)存由大量的觸發(fā)器組成。每個(gè)觸發(fā)器包含幾個(gè)晶體管能夠存儲(chǔ)一個(gè)比特譯注位??梢酝ㄟ^唯一標(biāo)識(shí)符來訪問單個(gè)觸發(fā)器,所以可以對(duì)它們進(jìn)行讀寫操作。比特稱為個(gè)字節(jié)。 原文 How JavaScript works: memory management + how to handle 4 common memory lea...
摘要:學(xué)習(xí)之路學(xué)習(xí)之路安裝環(huán)境起步開發(fā)工具自動(dòng)編譯文件中的數(shù)據(jù)類型中的函數(shù)中類的定義繼承中的繼承中的繼承類的靜態(tài)屬性和靜態(tài)方法類的多態(tài)的抽象類中的接口中的泛型學(xué)習(xí)之路安裝環(huán)境查看版本起步新建通過命令編譯此時(shí)路徑下 ...
閱讀 3704·2021-11-12 10:36
閱讀 3842·2021-09-22 15:48
閱讀 3551·2019-08-30 15:54
閱讀 2606·2019-08-29 16:44
閱讀 2374·2019-08-29 16:08
閱讀 2420·2019-08-29 16:06
閱讀 1294·2019-08-29 15:21
閱讀 3179·2019-08-29 12:39