最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中的稀疏數(shù)組與密集數(shù)組[譯]

 更新時(shí)間:2012年09月17日 02:44:38   作者:  
一般來說,JavaScript中的數(shù)組是稀疏的,也就是說,數(shù)組中的元素之間可以有空隙,因?yàn)橐粋€(gè)數(shù)組其實(shí)就是一個(gè)鍵值映射.本文解釋了如何創(chuàng)建稀疏數(shù)組和不稀疏的數(shù)組
1.稀疏數(shù)組
創(chuàng)建一個(gè)指定長(zhǎng)度的稀疏數(shù)組很簡(jiǎn)單:
復(fù)制代碼 代碼如下:

> var a = new Array(3);
> a
[ , , ]
> a.length
3
> a[0]
undefined

當(dāng)你遍歷它時(shí),你會(huì)發(fā)現(xiàn),它并沒有元素.JavaScript會(huì)跳過這些縫隙.
復(fù)制代碼 代碼如下:

> a.forEach(function (x, i) { console.log(i+". "+x) });
> a.map(function (x, i) { return i })
[ , , ]

譯者注:還有一些其他情況會(huì)生成稀疏數(shù)組,比如
復(fù)制代碼 代碼如下:

>var arr = [];
>arr[0] = 0;
>arr[100] = 100>a.forEach(function (x, i) { console.log(i+". "+x) });0. 0100. 100

2.密集數(shù)組

Brandon Benvie 最近在es-discuss郵件討論組中提到了一個(gè)創(chuàng)建密集數(shù)組的技巧:

復(fù)制代碼 代碼如下:

> var a = Array.apply(null, Array(3));
> a
[ undefined, undefined, undefined ]


上面的語句其實(shí)等同于:

Array(undefined, undefined, undefined)

但從表面上看,貌似這個(gè)數(shù)組和之前的稀疏數(shù)組并沒有太多的區(qū)別:
復(fù)制代碼 代碼如下:

> a.length
3
> a[0]
undefined

可是,你現(xiàn)在可以遍歷到這些數(shù)組元素了,還可以為每個(gè)元素重新賦值:
復(fù)制代碼 代碼如下:

> a.forEach(function (x, i) { console.log(i+". "+x) });
0. undefined
1. undefined
2. undefined

> a.map(function (x, i) { return i })
[ 0, 1, 2 ]

譯者注:實(shí)際上,JavaScript并沒有常規(guī)的數(shù)組,所有的數(shù)組其實(shí)就是個(gè)對(duì)象,只不過會(huì)自動(dòng)管理一些"數(shù)字"屬性和length屬性罷了.說的更直接一點(diǎn),JavaScript中的數(shù)組根本沒有索引,因?yàn)樗饕龖?yīng)該是數(shù)字,而JavaScript中數(shù)組的索引其實(shí)是字符串.arr[1]其實(shí)就是arr["1"],給arr["1000"] = 1,arr.length也會(huì)自動(dòng)變?yōu)?001.這些表現(xiàn)的根本原因就是,JavaScript中的對(duì)象就是字符串到任意值的鍵值對(duì).注意鍵只能是字符串.這和AWK類似.不信可以試試awk 'BEGIN{a[1]=1;print(a["1"])}'.也許這是因?yàn)?A target=_blank>Brendan Eich在發(fā)明JavaScript時(shí)參考了不少awk的設(shè)計(jì)的原因.不過目前,ES6中已經(jīng)有了類似于Java等語言的Map類型,鍵可以是任意類型的值.請(qǐng)參考我翻譯的MDN文檔Map

3.另一個(gè)技巧
郵件里還提到了另外一個(gè)技巧:
復(fù)制代碼 代碼如下:

> Array.apply(null, Array(3)).map(Function.prototype.call.bind(Number))
[ 0, 1, 2 ]

這大概等同于下面的寫法
復(fù)制代碼 代碼如下:

Array.apply(null, Array(3)).map(
function (x,i,...) { return Number.call(x,i,...) })

注意,x是call方法的第一個(gè)參數(shù),它作為了Number函數(shù)中的this值.這個(gè)值沒有什么意義,相當(dāng)于被忽略.我更喜歡下面這個(gè)能讓人一眼就看明白的寫法:
復(fù)制代碼 代碼如下:

Array.apply(null, Array(3)).map(function (x,i) { return i })

譯者注:
復(fù)制代碼 代碼如下:

Array.apply(null, Array(3)).map(Function.prototype.call.bind(Number))
//等同于Array.apply(null, Array(3)).map(Function.prototype.call,Number)

雖然使用自定義的函數(shù)更清晰,但自定義的函數(shù)肯定沒有原生方法快.舉個(gè)例子:

復(fù)制代碼 代碼如下:

var a = ["aaa ", " bbb", " ccc "]
a.map(function(x) { return x.trim(); }); // ['aaa', 'bbb', 'ccc']
a.map(Function.prototype.call, String.prototype.trim); // ['aaa', 'bbb', 'ccc']

上面使用map方法來trim掉每個(gè)數(shù)組元素的空格,使用原生的方法雖然難理解.但效率高.看不懂的可以查看下我翻譯的MDN文檔Array.prototype.map()

4.實(shí)際用途?

在實(shí)際生產(chǎn)中,使用上面講的創(chuàng)建密集數(shù)組的方法會(huì)讓別人無法讀懂你的代碼.所以封裝成一個(gè)工具函數(shù)會(huì)更好,比如 _.range:

復(fù)制代碼 代碼如下:

> _.range(3)
[ 0, 1, 2 ]

和map配合使用,可以使用某個(gè)指定的值填充整個(gè)數(shù)組.
復(fù)制代碼 代碼如下:

> _.range(3).map(function () { return "a" })
[ 'a', 'a', 'a' ]

譯者注:其他語言里,都有方便的生成遞增數(shù)字列表的辦法,比如perl和ruby里使用1..100,python里使用range(100),還有一個(gè)常見的需求就是生成一個(gè)重復(fù)某個(gè)字段的字符串,在ruby和python里,可以用"a"*100,在perl里用"a"x100,在JavaScript中,可以用Array(100).join("a")

5.相關(guān)文章

  1. Iterating over arrays and objects in JavaScript(已墻)
  2. Trying out Underscore on Node.js(已墻)

相關(guān)文章

  • JavaScript制作樓層導(dǎo)航效果流程詳解

    JavaScript制作樓層導(dǎo)航效果流程詳解

    項(xiàng)目中遇到比較多的的文檔內(nèi)容,為了方便查找里面的小內(nèi)容,一般都會(huì)在左側(cè)或者右側(cè)放一個(gè)固定樓層的導(dǎo)航欄,今天就來說一下這個(gè)固定樓層導(dǎo)航欄的思路以及實(shí)現(xiàn)的方法
    2021-10-10
  • ajax如何實(shí)現(xiàn)頁面局部跳轉(zhuǎn)與結(jié)果返回

    ajax如何實(shí)現(xiàn)頁面局部跳轉(zhuǎn)與結(jié)果返回

    AJAX即“Asynchronous Javascript And XML”(異步JavaScript和XML),是指一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù),通過在后臺(tái)與服務(wù)器進(jìn)行少量數(shù)據(jù)交換,AJAX 可以使網(wǎng)頁實(shí)現(xiàn)異步更新,本篇文章給大家介紹ajax如何實(shí)現(xiàn)頁面局部跳轉(zhuǎn)與結(jié)果返回,感興趣的朋友一起來學(xué)習(xí)
    2015-08-08
  • JS數(shù)組中常用方法技巧學(xué)會(huì)進(jìn)階成為大佬

    JS數(shù)組中常用方法技巧學(xué)會(huì)進(jìn)階成為大佬

    這篇文章主要為大家介紹了JS數(shù)組中常用的方法技巧,學(xué)會(huì)了你就在進(jìn)階成為大佬的道路上又邁進(jìn)了一步,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • JS實(shí)現(xiàn)簡(jiǎn)易刻度時(shí)鐘示例代碼

    JS實(shí)現(xiàn)簡(jiǎn)易刻度時(shí)鐘示例代碼

    本篇文章主要介紹了JS實(shí)現(xiàn)簡(jiǎn)易刻度時(shí)鐘示例代碼的資料,這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下。
    2017-03-03
  • Javascript實(shí)現(xiàn)飛動(dòng)廣告效果的方法

    Javascript實(shí)現(xiàn)飛動(dòng)廣告效果的方法

    這篇文章主要介紹了Javascript實(shí)現(xiàn)飛動(dòng)廣告效果的方法,可實(shí)現(xiàn)廣告窗口的浮動(dòng)顯示效果,且廣告窗口具有關(guān)閉功能,需要的朋友可以參考下
    2015-05-05
  • js 通過cookie實(shí)現(xiàn)刷新不變化樹形菜單

    js 通過cookie實(shí)現(xiàn)刷新不變化樹形菜單

    通過設(shè)置cookie來保存樹形菜單的狀態(tài),在頁面加載時(shí)重新讀取cookie來設(shè)置菜單
    2014-10-10
  • layui select 禁止點(diǎn)擊的實(shí)現(xiàn)方法

    layui select 禁止點(diǎn)擊的實(shí)現(xiàn)方法

    今天小編就為大家分享一篇layui select 禁止點(diǎn)擊的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • JS短信驗(yàn)證碼倒計(jì)時(shí)功能的實(shí)現(xiàn)(沒有驗(yàn)證碼,只有倒計(jì)時(shí))

    JS短信驗(yàn)證碼倒計(jì)時(shí)功能的實(shí)現(xiàn)(沒有驗(yàn)證碼,只有倒計(jì)時(shí))

    最近接了個(gè)項(xiàng)目,其中有這樣的需求:當(dāng)用戶想要獲取驗(yàn)證碼時(shí),就點(diǎn)擊免費(fèi)獲取驗(yàn)證碼 ,然后開始倒計(jì)時(shí),倒計(jì)時(shí)期間按鈕文字為剩余時(shí)間x秒,且不可按狀態(tài),倒計(jì)時(shí)結(jié)束后,按鈕更改為點(diǎn)擊重新發(fā)送,下面給大家分享js短信驗(yàn)證碼倒計(jì)時(shí)實(shí)現(xiàn)代碼
    2016-10-10
  • JS組件系列之JS組件封裝過程詳解

    JS組件系列之JS組件封裝過程詳解

    JS組件的擴(kuò)展和封裝,我們來感受下JQuery為我們提供$.Extend的神奇,接下來通過本文給大家分享JS組件系列之JS組件封裝過程詳解,需要的朋友參考下吧
    2017-04-04
  • js推箱子小游戲步驟代碼解析

    js推箱子小游戲步驟代碼解析

    本篇文章通過代碼分析給大家講解了JS制作推箱子小游戲的步驟以及要點(diǎn),需要的朋友參考學(xué)習(xí)下吧。
    2018-01-01

最新評(píng)論

甘南县| 安西县| 杭锦旗| 行唐县| 府谷县| 新津县| 崇明县| 三穗县| 杭锦旗| 邻水| 鹤峰县| 宁津县| 洛扎县| 福建省| 海伦市| 武冈市| 牙克石市| 泰州市| 称多县| 象州县| 昔阳县| 酉阳| 固原市| 武川县| 丰顺县| 宁晋县| 铜川市| 舞阳县| 桓台县| 临夏市| 康乐县| 湄潭县| 治县。| 平度市| 汨罗市| 健康| 靖远县| 洛川县| 正蓝旗| 广元市| 佛冈县|