本文是Rick Strahl在使用JavaScript數(shù)組上的經(jīng)驗(yàn)之談,在一些細(xì)微的地方介紹了JavaScript在處理數(shù)組上,相對(duì)于其他開發(fā)語(yǔ)言的不同之處,有些可能是我們自己想當(dāng)然的事情,但實(shí)際上不是那么回事,呵呵。具體涉及到JavaScript數(shù)組初始化、length、擴(kuò)展屬性等。
【原文】Javascript Array Fun 【作者】Rick Strahl 【譯文】http://cuimingda.com/2009/01/javascript-array-fun.html 【譯者】明達(dá)
以下是對(duì)原文的翻譯:
Josh在我之前的一篇帖子中留下了一條評(píng)論,指出在CSS property watcher component中存在一些小錯(cuò)誤,這是一個(gè)jQuery插件,將CSS屬性保存在數(shù)組中,并且跟蹤這些值的變化,當(dāng)發(fā)現(xiàn)CSS屬性值發(fā)生變化時(shí),會(huì)拋出一個(gè)事件,用戶可以在事件中做出相應(yīng)的處理。
我的錯(cuò)誤出在如何定義數(shù)組上:
var data = { props: props.split(","), func: func, vals: [props.split(",").length], itvlId: itId };
這段代碼是要建立一個(gè)特定長(zhǎng)度的數(shù)組,但顯然結(jié)果和我預(yù)想的不大一樣。實(shí)際上這個(gè)數(shù)組只包含一個(gè)元素,就是length的值,而要實(shí)現(xiàn)初始化數(shù)組的目標(biāo),正確的做法應(yīng)該是下面這個(gè)樣子:
vals: new Array(props.split(",").length)
可為什么我以前定義的方法錯(cuò)了,那個(gè)插件卻能正常運(yùn)行呢?因?yàn)镴avaScript可以根據(jù)賦值動(dòng)態(tài)的建立數(shù)組,而不需要預(yù)先進(jìn)行初始化,所以就算定義方法錯(cuò)了,也能正常運(yùn)行。
$.each(data.props, function(i) { data.vals[i] = el.css(data.props[i]); });
這段代碼遍歷了props數(shù)組,并且通過(guò)對(duì)vals數(shù)組對(duì)應(yīng)索引賦值,動(dòng)態(tài)的建立了一個(gè)新數(shù)組。
JavaScript的數(shù)組可以根據(jù)所賦的值自動(dòng)調(diào)整大小,比如下面這個(gè)例子: var ar = [] ar[2] = 1; debugger;
下面的結(jié)果是Firebug調(diào)試界面的截圖,可以看到數(shù)組中有三個(gè)元素。
點(diǎn)擊放大
這個(gè)數(shù)組的長(zhǎng)度是3,就像一個(gè)經(jīng)過(guò)初始化的數(shù)組一樣。所有沒(méi)有賦值的數(shù)組對(duì)象,都將被定義為undefined。
JavaScript可以自動(dòng)重新調(diào)整數(shù)組的大小,這真是太棒了,但也許預(yù)先設(shè)置一個(gè)固定的大小,可以避免數(shù)組內(nèi)部頻繁的調(diào)整大小。對(duì)已有的元素進(jìn)行賦值,肯定要比每次賦值前重新調(diào)整大小要快的多。
這種自動(dòng)調(diào)整大小的機(jī)制,更容易出現(xiàn)越界數(shù)組(out of bounds array),而且更難發(fā)現(xiàn)。所以要加倍注意類似的情況。
出處:七月佑安
責(zé)任編輯:bluehearts
上一頁(yè) 下一頁(yè) 有趣的JavaScript數(shù)組 [2]
◎進(jìn)入論壇網(wǎng)頁(yè)制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評(píng)論。
|