国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript中“數(shù)組也是對象”

Sike / 2270人閱讀

摘要:數(shù)組也是對象簡單來說,對象就是一系列屬性名值對,即某個屬性名對應(yīng)某個屬性值當(dāng)我們遍歷對象時,不在對象中的屬性當(dāng)然不會被訪問到。我們知道操作符用于刪除對象中某個屬性,而中,數(shù)組就是對象的一種,數(shù)組的索引就是其屬性名,對應(yīng)的項(xiàng)就是屬性值。

先說結(jié)論吧:

</>復(fù)制代碼

  1. 數(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ù)制代碼

  1. MDN:

  2. it is not invoked for indexes that are undefined, those which have been deleted or which have never been assigned values.

</>復(fù)制代碼

  1. ECMA:

  2. 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ù)制代碼

  1. javascriptArray.prototype.myMap = function (fn, context) {
  2. context = context || window;
  3. var ary = [];
  4. if (Array.prototype.map) {
  5. ary = this.map(fn, context);
  6. } else {
  7. for (var i = 0; i < this.length; i++) {
  8. ary[i] = fn.apply(context, [this[i], i, this]);
  9. }
  10. }
  11. return ary;
  12. }

這個實(shí)現(xiàn)比較簡單,流程很清晰,如果瀏覽器有原生數(shù)組map方法,調(diào)用該方法,否則執(zhí)行else中的語句;但是如果是下面這樣一個數(shù)組,在沒有實(shí)現(xiàn)原生map方法的瀏覽器中,結(jié)果跟原生map方法調(diào)用不一樣:

</>復(fù)制代碼

  1. javascriptvar arr=[1,2,,,3];
  2. 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ù)制代碼

  1. 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)值賦值為undefinedlength不改變;

當(dāng)人為地設(shè)置數(shù)組的length屬性值時,length隨之改變,同時索引不小于該值的都會被從數(shù)組中徹底刪除。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/85814.html

相關(guān)文章

  • JavaScript學(xué)習(xí)筆記之數(shù)組(一)

    摘要:數(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 ...

    Yangder 評論0 收藏0
  • JavaScript語言精粹 修訂版》 讀書筆記

    摘要:于是我就先把這本薄的經(jīng)典書語言精粹修訂版豆瓣讀書本書簡介總共章,除去附錄,才頁,讀完并記錄了一些筆記。讀書筆記還可以分享給別人看。編程語言第版定義了的標(biāo)準(zhǔn)。程序檢查時丟棄值為函數(shù)的屬性。 之前看到這篇文章,前端網(wǎng)老姚淺談:怎么學(xué)JavaScript?,說到怎么學(xué)習(xí)JavaScript,那就是看書、分析源碼。10本書讀2遍的好處,應(yīng)該大于一本書讀20遍。看書主動學(xué)習(xí),看視頻是被動學(xué)習(xí)。看...

    EscapedDog 評論0 收藏0
  • ES5學(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)容。這里面有一些自...

    HackerShell 評論0 收藏0
  • javascript高級程序設(shè)計(jì)》筆記_數(shù)組 稀疏數(shù)組數(shù)組

    摘要:數(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ù)值,用第三個位置來保存對象, 以此類...

    pepperwang 評論0 收藏0
  • JavaScript入門】Array類型

    摘要:數(shù)組也是對象數(shù)據(jù)類型的數(shù)組也有屬性名,只不過屬性名是數(shù)字,我們把數(shù)字屬性名稱之為它的索引數(shù)組是以數(shù)字作為索引,索引從零開始,有一個屬性代表數(shù)組的長度。 Array 數(shù)組也是對象數(shù)據(jù)類型的 typeof [] ->object數(shù)組也有屬性名,只不過屬性名是數(shù)字,我們把數(shù)字屬性名稱之為它的索引:數(shù)組是以數(shù)字作為索引,索引從零開始,有一個length屬性代表數(shù)組的長度。 showImg(h...

    zxhaaa 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<