原創(chuàng)|其它|編輯:郝浩|2009-02-23 17:19:54.000|閱讀 698 次
概述:本文是Rick Strahl在使用JavaScript數(shù)組上的經(jīng)驗之談,在一些細微的地方介紹了JavaScript在處理數(shù)組上,相對于其他開發(fā)語言的不同之處,有 些可能是我們自己想當然的事情,但實際上不是那么回事,呵呵。具體涉及到JavaScript數(shù)組初始化、length、擴展屬性等。 【原文】Javascript Array Fun 【作者】Rick Strahl 【譯文】//cuimingda.com/2009/01/javascript-array-fun.html 【譯者】明達 以下是對原文的翻譯: Josh在我之前的一篇帖子中留下了一條評論,指出在CSS pr
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
本文是Rick Strahl在使用JavaScript數(shù)組上的經(jīng)驗之談,在一些細微的地方介紹了JavaScript在處理數(shù)組上,相對于其他開發(fā)語言的不同之處,有 些可能是我們自己想當然的事情,但實際上不是那么回事,呵呵。具體涉及到JavaScript數(shù)組初始化、length、擴展屬性等。
【原文】【作者】【譯文】
【譯者】
以下是對原文的翻譯:
Josh在我之前的一篇帖子中留下了一條評論,指出在CSS property watcher component中存在一些小錯誤,這是一個jQuery插件,將CSS屬性保存在數(shù)組中,并且跟蹤這些值的變化,當發(fā)現(xiàn)CSS屬性值發(fā)生變化時,會拋 出一個事件,用戶可以在事件中做出相應的處理。
我的錯誤出在如何定義數(shù)組上:
var data = {
props: props.split(","),
func: func,
vals: [props.split(",").length],
itvlId: itId
};
這段代碼是要建立一個特定長度的數(shù)組,但顯然結(jié)果和我預想的不大一樣。實際上這個數(shù)組只包含一個元素,就是length的值,而要實現(xiàn)初始化數(shù)組的目標,正確的做法應該是下面這個樣子:
vals: new Array(props.split(",").length)
可為什么我以前定義的方法錯了,那個插件卻能正常運行呢?因為JavaScript可以根據(jù)賦值動態(tài)的建立數(shù)組,而不需要預先進行初始化,所以就算定義方法錯了,也能正常運行。
$.each(data.props, function(i) { data.vals[i] = el.css(data.props[i]); });
這段代碼遍歷了props數(shù)組,并且通過對vals數(shù)組對應索引賦值,動態(tài)的建立了一個新數(shù)組。
JavaScript的數(shù)組可以根據(jù)所賦的值自動調(diào)整大小,比如下面這個例子:
var ar = []
ar[2] = 1;
debugger;
下面的結(jié)果是Firebug調(diào)試界面的截圖,可以看到數(shù)組中有三個元素。
這個數(shù)組的長度是3,就像一個經(jīng)過初始化的數(shù)組一樣。所有沒有賦值的數(shù)組對象,都將被定義為undefined。
JavaScript可以自動重新調(diào)整數(shù)組的大小,這真是太棒了,但也許預先設置一個固定的大小,可以避免數(shù)組內(nèi)部頻繁的調(diào)整大小。對已有的元素進行賦值,肯定要比每次賦值前重新調(diào)整大小要快的多。
這種自動調(diào)整大小的機制,更容易出現(xiàn)越界數(shù)組(out of bounds array),而且更難發(fā)現(xiàn)。所以要加倍注意類似的情況。
關于動態(tài)數(shù)組,下面介紹的這個情況也很有意思:
var ar = []
ar["test"] = 4;
ar[3] = 1;
var len = ar.length;
debugger;
讓我們來猜一猜,此時此刻這個數(shù)組的大小應該是多少呢?
這段代碼建立了一個數(shù)組,其中包含數(shù)值索引和字符串索引,而且這可以正常工作,無論你使用ar[3]還是ar["test"]都可以得到預期的結(jié)果。下面的截圖展示了在Firebug中的調(diào)試結(jié)果:
請注意,數(shù)組的長度是4,而此時數(shù)組中包含4個數(shù)值索引的元素和一個字符串索引的元素。也就是說,字符串索引的元素是不計入數(shù)組長度的計算范圍的。 而取而代之的,字符串索引器實際上作為數(shù)組對象的一個擴展屬性而存在。Visual Studio JavaScript Debugger更加準確的證明了這點:
從這張截圖可以看出,test已經(jīng)成為array對象的一個屬性,和length屬性的性質(zhì)是一模一樣的。
本文沒有提到什么新內(nèi)容,但如果不了解JavaScript在處理數(shù)組上的細微差別,就會出現(xiàn)類似我之前所犯下的錯誤。上面提到的內(nèi)容都是我在實際開發(fā)過程中曾經(jīng)遇到過的問題,借這個機會記錄下來,就當是給自己的備忘錄了,如果恰好對你有幫助,將不勝榮幸。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務必注明出處、不得修改原文相關鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:藍色理想