|
测试代码:
复制代码 代码如下:
Array.prototype.max = function()
{
return Math.max.apply({}, this);
};
var company = ['Adobe','Apple','Google','Intel','Microsoft','Oracle','IBM','SUN'];
alert(company.length); //这里输出的长度是8,与上面定义的数组长度一致
//下面循环了9次,在IE6、IE7第一次循环时i值不是0而是上面原型扩展的方法名max,而在IE8、FF浏览器最后一次循环时i值才为max
for (var i in company)
{
alert('index is:'+i+'/nvalue is:'+company[i]);
}
//此时,你若仅想打印上面8个公司列表,用for in循环是不行了,即使你非要这样做,也要在循环内部做点判断,比如像下面这样:
for (var i in company)
{
if (!isNaN(i))
alert('index is:'+i+'/nvalue is:'+company[i]);
}
//当然,为了安全起见,也不要那么懒,就写成普通的for循环才是最科学的,像下面这样:
for (var i=0; i< company.length; i++)
{
alert('index is:'+i+'/nvalue is:'+company[i]);
}
//这种对数组原型扩展属性带来的循环问题通常是导致你得不到预期的结果,但不注意也可能给你代码带来难以发现的问题,看看下面的例子:
var userInfo = [["Tom",21,"020-12345678"],["Mike",23,"020-87654321"]]; //显然这里是数组嵌套
for (var i in userInfo)
{
//此时通过userInfo[i][0]可能根本得不到你预想的值,比如在这个循环中,你将看到有一次值为undefined的结果,这是因为当i值为max时,userInfo[i]是一个function而不是像这样的子数组 ["Tom",21,"020-12345678"]
alert('Name:' + userInfo[i][0] + '/nAge:' + userInfo[i][1] + '/nPhone:' + userInfo[i][2]);
}
一般来说for in是用来遍历对象属性的,而数组还是要用for来遍历(当然数组也是对象)。据了解,for要比for in的遍历效率高,另外像C#、ActionScript3.0还有foreach循环,这将是效率最高的循环,不过JavaScript没有这种循环。最科学的数组遍历应该像这样:使用普通的for循环,而且预存数组长度。代码如下:
复制代码 代码如下:
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
JavaScript技术:数组Array进行原型prototype扩展后带来的for in遍历问题,转载需保留来源!
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。