摘要:數(shù)組也是對(duì)象簡(jiǎn)單來(lái)說(shuō),對(duì)象就是一系列屬性名值對(duì),即某個(gè)屬性名對(duì)應(yīng)某個(gè)屬性值當(dāng)我們遍歷對(duì)象時(shí),不在對(duì)象中的屬性當(dāng)然不會(huì)被訪問(wèn)到。我們知道操作符用于刪除對(duì)象中某個(gè)屬性,而中,數(shù)組就是對(duì)象的一種,數(shù)組的索引就是其屬性名,對(duì)應(yīng)的項(xiàng)就是屬性值。
先說(shuō)結(jié)論吧:
數(shù)組的map方法在IE9以下是不支持的,因此需要寫一個(gè)兼容方法來(lái)實(shí)現(xiàn)此行為,在實(shí)現(xiàn)兼容的時(shí)候:必須注意:對(duì)于數(shù)組中被刪除(delete)或者根本從未賦值的索引項(xiàng),map中第一個(gè)函數(shù)參數(shù)是不會(huì)執(zhí)行的。
關(guān)于這一點(diǎn),在ECMA標(biāo)準(zhǔn)和MDN參考文檔都是有說(shuō)明的:
MDN:
it is not invoked for indexes that are undefined, those which have been deleted or which have never been assigned values.
ECMA:
callbackfn is called only for elements of the array which actually exist; it is not called for missing elements of the array.
我看到一些用來(lái)兼容的方法,都沒(méi)有注意到這種情形,那么不注意這種情形會(huì)出現(xiàn)什么問(wèn)題呢?為什么MDN上給的兼容方法會(huì)這么曲折呢?
我先把我在培訓(xùn)班的老師給出的兼容方法貼出來(lái):
javascriptArray.prototype.myMap = function (fn, context) { context = context || window; var ary = []; if (Array.prototype.map) { ary = this.map(fn, context); } else { for (var i = 0; i < this.length; i++) { ary[i] = fn.apply(context, [this[i], i, this]); } } return ary; }
這個(gè)實(shí)現(xiàn)比較簡(jiǎn)單,流程很清晰,如果瀏覽器有原生數(shù)組map方法,調(diào)用該方法,否則執(zhí)行else中的語(yǔ)句;但是如果是下面這樣一個(gè)數(shù)組,在沒(méi)有實(shí)現(xiàn)原生map方法的瀏覽器中,結(jié)果跟原生map方法調(diào)用不一樣:
javascriptvar arr=[1,2,,,3]; console.dir(arr.myMap(function(e,i,a){return e*2;}));
原生map方法執(zhí)行上述代碼的輸出是
而如果瀏覽器不支持原生map方法,會(huì)執(zhí)行else語(yǔ)句,這樣的輸出是:
你看,這兩者執(zhí)行區(qū)別就在于一開始的結(jié)論:原生的map方法跳過(guò)了那些從未賦值的索引對(duì)應(yīng)的項(xiàng)。
數(shù)組也是對(duì)象??!簡(jiǎn)單來(lái)說(shuō),對(duì)象就是一系列屬性名值對(duì),即某個(gè)屬性名對(duì)應(yīng)某個(gè)屬性值;當(dāng)我們遍歷對(duì)象時(shí),不在對(duì)象中的屬性當(dāng)然不會(huì)被訪問(wèn)到。
而在JS中,數(shù)組就是對(duì)象,甚至數(shù)組的一些遍歷方法,在內(nèi)部執(zhí)行的時(shí)候,都是先將數(shù)組轉(zhuǎn)化為對(duì)象,
javascriptvar O=Object(this);
然后遍歷數(shù)組對(duì)象中,所有已經(jīng)定義的,且索引為數(shù)字的項(xiàng)。在絕大部分情況下,這些數(shù)字剛好是連續(xù)的。那什么時(shí)候會(huì)出現(xiàn)不連續(xù)呢?我所知道有這兩種;
以字面量方式新創(chuàng)建數(shù)組的時(shí)候,連續(xù)的逗號(hào),會(huì)形成數(shù)字索引不連續(xù);如var arr=[1,2,,,3],你可以在瀏覽器控制臺(tái)中試試輸出console.dir([1,2,,,3])的結(jié)果(注意,一定要用console.dir方法);
利用delete操作符刪除數(shù)組中的某項(xiàng)。我們知道delete操作符用于刪除對(duì)象中某個(gè)屬性,而JS中,數(shù)組就是對(duì)象的一種,數(shù)組的索引就是其屬性名,對(duì)應(yīng)的項(xiàng)就是屬性值。用delete刪除后,數(shù)組中的這對(duì)屬性名值對(duì)(又稱鍵值對(duì))就不存在了,這時(shí)候?qū)ζ洳捎帽闅v方法,當(dāng)然不會(huì)針對(duì)不存在名值對(duì)進(jìn)行調(diào)用了。
有一點(diǎn)要特別注意,數(shù)組中被刪除的項(xiàng)或者從未定義的項(xiàng),與人為將其值設(shè)置為undefined的項(xiàng),盡管如果強(qiáng)行訪問(wèn),結(jié)果都是undefined,但是是不太一樣的,比如這樣一個(gè)數(shù)組,[1,,undefined];,該數(shù)組(現(xiàn)在我們可以更準(zhǔn)確得說(shuō):數(shù)組對(duì)象)中不存在索引為1的項(xiàng),但是卻存在索引為2的項(xiàng),可以用console.dir輸出看出區(qū)別。 數(shù)組的length屬性還能反映數(shù)組長(zhǎng)度嗎?說(shuō)到上面這些,你肯定已經(jīng)意識(shí)到了,既然數(shù)組的索引可以被跳過(guò),那數(shù)組的length屬性還能反映其長(zhǎng)度嗎?
關(guān)于這個(gè)問(wèn)題,我是這么理解的,
數(shù)組的length屬性并不能反應(yīng)數(shù)組中元素的數(shù)目,在絕大多數(shù)情況(即沒(méi)有人工干預(yù)length屬性,且數(shù)組中沒(méi)有跳過(guò)的索引),它只是剛好,剛好等于最大的索引加一。當(dāng)我們從對(duì)象的角度來(lái)看待數(shù)組時(shí),像0、1、2、3、4、5、6等等這些數(shù)字索引和length一樣,都只是數(shù)組對(duì)象的屬性。
用delete操作符刪除數(shù)組任意一項(xiàng),或者將任意一項(xiàng)值賦值為undefined,length不改變;
當(dāng)人為地設(shè)置數(shù)組的length屬性值時(shí),length隨之改變,同時(shí)索引不小于該值的都會(huì)被從數(shù)組中徹底刪除。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/85814.html
摘要:數(shù)組基礎(chǔ)篇數(shù)組的語(yǔ)法數(shù)組是按次序排列的一組值。屬性數(shù)組的屬性,返回?cái)?shù)組的成員數(shù)量。通過(guò)設(shè)置的值改變數(shù)組的長(zhǎng)度將屬性設(shè)為可以清空數(shù)組。類似數(shù)組的對(duì)象并不是數(shù)組,因?yàn)樗鼈儾痪邆鋽?shù)組特有的方法。 數(shù)組基礎(chǔ)篇 1.數(shù)組的語(yǔ)法 數(shù)組(array)是按次序排列的一組值。每個(gè)值的位置都有編號(hào)(從0開始)。var arr=[1,2,3] //arr[0]=1任何類型的數(shù)據(jù),都可以放入數(shù)組。 var ...
摘要:于是我就先把這本薄的經(jīng)典書語(yǔ)言精粹修訂版豆瓣讀書本書簡(jiǎn)介總共章,除去附錄,才頁(yè),讀完并記錄了一些筆記。讀書筆記還可以分享給別人看。編程語(yǔ)言第版定義了的標(biāo)準(zhǔn)。程序檢查時(shí)丟棄值為函數(shù)的屬性。 之前看到這篇文章,前端網(wǎng)老姚淺談:怎么學(xué)JavaScript?,說(shuō)到怎么學(xué)習(xí)JavaScript,那就是看書、分析源碼。10本書讀2遍的好處,應(yīng)該大于一本書讀20遍??磿鲃?dòng)學(xué)習(xí),看視頻是被動(dòng)學(xué)習(xí)。看...
摘要:對(duì)象是一個(gè)值超出有效范圍時(shí)發(fā)生的錯(cuò)誤。包括返回原數(shù)組包括數(shù)組對(duì)象函數(shù)可以用來(lái)判斷變量是否為對(duì)象數(shù)組對(duì)象函數(shù)構(gòu)造函數(shù)與直接賦值是等價(jià)的。只適用于,數(shù)組不適用通過(guò)可以看出一個(gè)值到底是什么類型,其中返回值的第二個(gè)值表示該值的構(gòu)造函數(shù)。 這是ES5的入門篇教程的筆記,網(wǎng)址:JavaScript教程,以下內(nèi)容中黑體表示大標(biāo)題,還有一些重點(diǎn);斜體表示對(duì)于自身,還需要下功夫?qū)W習(xí)的內(nèi)容。這里面有一些自...
摘要:數(shù)組是數(shù)據(jù)的有序列表,與其他語(yǔ)言不同的是,數(shù)組的每一項(xiàng)可以保存任何類型的數(shù)據(jù)。如下的代碼創(chuàng)建的就是一個(gè)密集數(shù)組稀疏數(shù)組與密集數(shù)組相反,并不強(qiáng)制要求數(shù)組元素是緊密相連的,即允許間隙的存在。 數(shù)組是數(shù)據(jù)的有序列表,與其他語(yǔ)言不同的是,ECMAScript 數(shù)組的每一項(xiàng)可以保存任何類型的數(shù)據(jù)。也就是說(shuō),可以用數(shù)組的第一個(gè)位置來(lái)保存字符串,用第二位置來(lái)保存數(shù)值,用第三個(gè)位置來(lái)保存對(duì)象, 以此類...
摘要:數(shù)組也是對(duì)象數(shù)據(jù)類型的數(shù)組也有屬性名,只不過(guò)屬性名是數(shù)字,我們把數(shù)字屬性名稱之為它的索引數(shù)組是以數(shù)字作為索引,索引從零開始,有一個(gè)屬性代表數(shù)組的長(zhǎng)度。 Array 數(shù)組也是對(duì)象數(shù)據(jù)類型的 typeof [] ->object數(shù)組也有屬性名,只不過(guò)屬性名是數(shù)字,我們把數(shù)字屬性名稱之為它的索引:數(shù)組是以數(shù)字作為索引,索引從零開始,有一個(gè)length屬性代表數(shù)組的長(zhǎng)度。 showImg(h...
閱讀 2019·2021-09-22 10:02
閱讀 2037·2021-09-02 15:40
閱讀 2948·2019-08-30 15:55
閱讀 2419·2019-08-30 15:44
閱讀 3686·2019-08-30 13:18
閱讀 3319·2019-08-30 11:00
閱讀 2043·2019-08-29 16:57
閱讀 643·2019-08-29 16:41