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