數(shù)組Array進(jìn)行原型prototype擴(kuò)展后帶來(lái)的for in遍歷問(wèn)題
更新時(shí)間:2010年02月07日 11:57:13 作者:
不同的程序語(yǔ)言都有多種循環(huán)語(yǔ)句,而且功能是差不多的,當(dāng)然使用場(chǎng)合還是有些區(qū)別的,比如for與for in,for in比較好用,它不需要預(yù)先知道對(duì)象屬性的長(zhǎng)度。
通常在JavaScript中用for與for in遍歷數(shù)組結(jié)果是沒(méi)有什么區(qū)別的,它的循環(huán)變量i都是從0開始的數(shù)組索引(for in如果遍歷的是非數(shù)組對(duì)象的屬性集合,則這個(gè)i就是屬性名,或稱之為key)。另外要注意一點(diǎn)是:用for in遍歷數(shù)組,循環(huán)變量i是字符串類型的。如果對(duì)Array進(jìn)行原型擴(kuò)展后,再用for in來(lái)對(duì)數(shù)組進(jìn)行遍歷時(shí)就要注意些問(wèn)題了。
測(cè)試代碼:
Array.prototype.max = function()
{
return Math.max.apply({}, this);
};
var company = ['Adobe','Apple','Google','Intel','Microsoft','Oracle','IBM','SUN'];
alert(company.length); //這里輸出的長(zhǎng)度是8,與上面定義的數(shù)組長(zhǎng)度一致
//下面循環(huán)了9次,在IE6、IE7第一次循環(huán)時(shí)i值不是0而是上面原型擴(kuò)展的方法名max,而在IE8、FF瀏覽器最后一次循環(huán)時(shí)i值才為max
for (var i in company)
{
alert('index is:'+i+'\nvalue is:'+company[i]);
}
//此時(shí),你若僅想打印上面8個(gè)公司列表,用for in循環(huán)是不行了,即使你非要這樣做,也要在循環(huán)內(nèi)部做點(diǎn)判斷,比如像下面這樣:
for (var i in company)
{
if (!isNaN(i))
alert('index is:'+i+'\nvalue is:'+company[i]);
}
//當(dāng)然,為了安全起見(jiàn),也不要那么懶,就寫成普通的for循環(huán)才是最科學(xué)的,像下面這樣:
for (var i=0; i< company.length; i++)
{
alert('index is:'+i+'\nvalue is:'+company[i]);
}
//這種對(duì)數(shù)組原型擴(kuò)展屬性帶來(lái)的循環(huán)問(wèn)題通常是導(dǎo)致你得不到預(yù)期的結(jié)果,但不注意也可能給你代碼帶來(lái)難以發(fā)現(xiàn)的問(wèn)題,看看下面的例子:
var userInfo = [["Tom",21,"020-12345678"],["Mike",23,"020-87654321"]]; //顯然這里是數(shù)組嵌套
for (var i in userInfo)
{
//此時(shí)通過(guò)userInfo[i][0]可能根本得不到你預(yù)想的值,比如在這個(gè)循環(huán)中,你將看到有一次值為undefined的結(jié)果,這是因?yàn)楫?dāng)i值為max時(shí),userInfo[i]是一個(gè)function而不是像這樣的子數(shù)組 ["Tom",21,"020-12345678"]
alert('Name:' + userInfo[i][0] + '\nAge:' + userInfo[i][1] + '\nPhone:' + userInfo[i][2]);
}
一般來(lái)說(shuō)for in是用來(lái)遍歷對(duì)象屬性的,而數(shù)組還是要用for來(lái)遍歷(當(dāng)然數(shù)組也是對(duì)象)。據(jù)了解,for要比f(wàn)or in的遍歷效率高,另外像C#、ActionScript3.0還有foreach循環(huán),這將是效率最高的循環(huán),不過(guò)JavaScript沒(méi)有這種循環(huán)。最科學(xué)的數(shù)組遍歷應(yīng)該像這樣:使用普通的for循環(huán),而且預(yù)存數(shù)組長(zhǎng)度。代碼如下:
var company = ['Adobe', 'Apple', 'Google', 'Intel', 'Microsoft', 'Oracle', 'IBM', 'SUN'];
for (var i = 0, companyNum = company.length; i < companyNum; i++)
{
alert('index is:' + i + '\nvalue is:' + company[i]);
}
作者:WebFlash
出處:http://webflash.cnblogs.com
測(cè)試代碼:
復(fù)制代碼 代碼如下:
Array.prototype.max = function()
{
return Math.max.apply({}, this);
};
var company = ['Adobe','Apple','Google','Intel','Microsoft','Oracle','IBM','SUN'];
alert(company.length); //這里輸出的長(zhǎng)度是8,與上面定義的數(shù)組長(zhǎng)度一致
//下面循環(huán)了9次,在IE6、IE7第一次循環(huán)時(shí)i值不是0而是上面原型擴(kuò)展的方法名max,而在IE8、FF瀏覽器最后一次循環(huán)時(shí)i值才為max
for (var i in company)
{
alert('index is:'+i+'\nvalue is:'+company[i]);
}
//此時(shí),你若僅想打印上面8個(gè)公司列表,用for in循環(huán)是不行了,即使你非要這樣做,也要在循環(huán)內(nèi)部做點(diǎn)判斷,比如像下面這樣:
for (var i in company)
{
if (!isNaN(i))
alert('index is:'+i+'\nvalue is:'+company[i]);
}
//當(dāng)然,為了安全起見(jiàn),也不要那么懶,就寫成普通的for循環(huán)才是最科學(xué)的,像下面這樣:
for (var i=0; i< company.length; i++)
{
alert('index is:'+i+'\nvalue is:'+company[i]);
}
//這種對(duì)數(shù)組原型擴(kuò)展屬性帶來(lái)的循環(huán)問(wèn)題通常是導(dǎo)致你得不到預(yù)期的結(jié)果,但不注意也可能給你代碼帶來(lái)難以發(fā)現(xiàn)的問(wèn)題,看看下面的例子:
var userInfo = [["Tom",21,"020-12345678"],["Mike",23,"020-87654321"]]; //顯然這里是數(shù)組嵌套
for (var i in userInfo)
{
//此時(shí)通過(guò)userInfo[i][0]可能根本得不到你預(yù)想的值,比如在這個(gè)循環(huán)中,你將看到有一次值為undefined的結(jié)果,這是因?yàn)楫?dāng)i值為max時(shí),userInfo[i]是一個(gè)function而不是像這樣的子數(shù)組 ["Tom",21,"020-12345678"]
alert('Name:' + userInfo[i][0] + '\nAge:' + userInfo[i][1] + '\nPhone:' + userInfo[i][2]);
}
一般來(lái)說(shuō)for in是用來(lái)遍歷對(duì)象屬性的,而數(shù)組還是要用for來(lái)遍歷(當(dāng)然數(shù)組也是對(duì)象)。據(jù)了解,for要比f(wàn)or in的遍歷效率高,另外像C#、ActionScript3.0還有foreach循環(huán),這將是效率最高的循環(huán),不過(guò)JavaScript沒(méi)有這種循環(huán)。最科學(xué)的數(shù)組遍歷應(yīng)該像這樣:使用普通的for循環(huán),而且預(yù)存數(shù)組長(zhǎng)度。代碼如下:
復(fù)制代碼 代碼如下:
var company = ['Adobe', 'Apple', 'Google', 'Intel', 'Microsoft', 'Oracle', 'IBM', 'SUN'];
for (var i = 0, companyNum = company.length; i < companyNum; i++)
{
alert('index is:' + i + '\nvalue is:' + company[i]);
}
作者:WebFlash
出處:http://webflash.cnblogs.com
您可能感興趣的文章:
- 詳談js遍歷集合(Array,Map,Set)
- Java中ArrayList和LinkedList的遍歷與性能分析
- jQuery篩選數(shù)組之grep、each、inArray、map的用法及遍歷json對(duì)象
- C#常見(jiàn)的幾種集合 ArrayList,Hashtable,List<T>,Dictionary<K,V> 遍歷方法對(duì)比
- JavaScript中循環(huán)遍歷Array與Map的方法小結(jié)
- java arrayList遍歷的四種方法及Java中ArrayList類的用法
- java使用ArrayList遍歷及效率比較實(shí)例分析
- 解決遍歷時(shí)Array.indexOf產(chǎn)生的性能問(wèn)題
- flex array 搜索 遍歷
- js中Array對(duì)象的常用遍歷方法詳解
相關(guān)文章
在javascript中執(zhí)行任意html代碼的方法示例解讀
關(guān)于javascript的eval()函數(shù)無(wú)法執(zhí)行html代碼的問(wèn)題,下面為大家介紹下一種在javascript中執(zhí)行任意html代碼的方法,感興趣的朋友不要錯(cuò)過(guò)2013-12-12PixiJS學(xué)習(xí)之常見(jiàn)圖形的繪制詳解
pixijs 是一個(gè)強(qiáng)大的 Web Canvas 2D 庫(kù),以其強(qiáng)大性能而著稱。這篇文章主要帶大家學(xué)習(xí)一下PixiJS是如何實(shí)現(xiàn)常見(jiàn)圖形繪制的,希望對(duì)大家有所幫助2023-02-02簡(jiǎn)單的無(wú)縫滾動(dòng)程序-僅幾行代碼
簡(jiǎn)單的無(wú)縫滾動(dòng)程序-僅幾行代碼...2007-05-05JavaScript實(shí)現(xiàn)兩個(gè)數(shù)組的交集
這篇文章主要介紹了JavaScript實(shí)現(xiàn)兩個(gè)數(shù)組的交集,給定兩個(gè)數(shù)組???nums1???和??nums2??返回它們的交集,輸出結(jié)果中的每個(gè)元素一定是唯一的,下文詳細(xì)介紹,需要的小伙伴可以參考一下2022-03-03JavaScript中將一個(gè)值轉(zhuǎn)換為字符串的方法分析[譯]
在JavaScript中,主要有三種方法能讓任意值轉(zhuǎn)換為字符串.本文講解了每種方法以及各自的優(yōu)缺點(diǎn)2012-09-09JS實(shí)現(xiàn)不使用圖片仿Windows右鍵菜單效果代碼
這篇文章主要介紹了JS實(shí)現(xiàn)不使用圖片仿Windows右鍵菜單效果代碼,涉及文鼎字及css樣式的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10AJAX異步從優(yōu)酷專輯中采集所有視頻及信息(JavaScript代碼)
上次寫了一個(gè) .NET從優(yōu)酷專輯中采集所有視頻及信息(VB.NET代碼)2010-11-11