JavaScript在多浏览器下for循环的使用方法_javascript技巧
JavaScript语言在不同的浏览器的下有存在细微的差异,但不像DOM操作差异那么大,现在为大家列举出其中一个"for循环"的差异,并介绍如何有效的解决这种差异。
二、问题描述
在下面的 测试代码 例1 中IE6和Chrome输出的结果是不一致,IE6不执行for语句里的代码
//例1:
alert("准备测试toString是否被for循环枚举出来")
var forTest = { toString: 1 }
for (i in forTest) {
alert("toString被循环出来")//在IE6下这是不执行的,但是在Chrome执行并输出结果值“1”
}
三、分析问题
JavaScript中的对象包含了 'toString', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable','toLocaleString', 'hasOwnProperty', 'constructor'这7个内置方法。这7个内置方法用for语句是无法枚举出来的。但是IE6和Chrome对内置方法覆盖的支持不一致。
IE6:虽然 可以对其内置覆盖 方法,但是 FOR循环无法枚举 出来。
Chrome:可以对其内置覆盖 方法,FOR循环也能枚举出覆盖的内置方法。
所以上面的 测试代码 例1 中 IE6和Chrome浏览器输出结果不一致
四、解决问题
我们要解决上面描述的问题,我们要做二件事情:
用户使用的浏览器是否支持 FOR循环枚举出覆盖的内置方法
如何优雅的解决不兼容问题,使所有的浏览器都可以 FOR循环枚举出覆盖的内置方法
(解决代码 例2)
//例2:
enumerables = true,
forTest = { toString: 1 }
for (i in forTest) {
enumerables = null;
}
if (enumerables) {//这些都是Object对象的属性,有的浏览器(ie6)的for循环不会把这些属性给遍历出来,所以要手功的把属性遍历出来
enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable',
'toLocaleString', 'toString', 'constructor'];
}
//如果enumerables为null则浏览器支持枚举覆盖的内置方法,否则只能如下面的代码强制的把内置方法复制到新的对象中。
/**
* 所有属性复制到指定的对象
* @param {Object} object 待合并的对象
* @param {Object} config 来源属性
* @return {Object} 返回合并后的对象
*/
function apply(object, config) {
if (object && config && typeof config === 'object') {
var i, j, k;
//这里正常的复制对象的方法
for (i in config) {
object[i] = config[i];
}
//兼容多浏览器把内置的属性都能重制新的对象中
if (enumerables) {
for (j = enumerables.length; j--;) {
k = enumerables[j];
if (config.hasOwnProperty(k)) {//判断对象是否有某个特定的属性。必须用字符串指定该属性。(例如,config.hasOwnProperty("toString"))
object[k] = config[k];
}
}
}
}
return object;
};
现在编写几个测试代码,来验证我们成果 (测试代码 例3)
//例3:
var a={};
for (i in forTest) {
a[i] = forTest[i];
}
alert(a.toString) //ie6下复制失败只能输入"native code",并不是输出我们覆盖的值
var b=apply({},forTest)
alert(b.toString)//使用apply函数,在IE6和Chrome输出的值都是我们预期想得到的覆盖值”1“
五、总结
笔者猜测在IE6里的for语句把那7个内置函数标识到忽略列表,所以怎么覆盖也不能在for中枚举出来,而Chrome就能够智能的把覆盖后的内置函数复制出来。
使用解决代码 例2 中的apply函数即可解决多浏览器下for循环不一致的问题 。
笔者是个菜鸟,也很少写博客,如果我表达观点的有错,或者有笔误,还请肯请大鸟们纠正错误。
六、常见问题
问:为什么不先判断浏览器的版本是否为IE6,在来设置对应的枚举方案呢?
答:我个人的观点是,我不确定市场那么多的浏览器(PC机就有N种浏览器,还有手机浏览器,以后也不知道还有什么新版本的浏览器)分别是用什么机制的for语制。所以就先测试那的for语句的机制。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

在加密货币市场中,选择一个可靠的交易平台是至关重要的。OK交易平台作为全球知名的数字资产交易所,吸引了大量大陆新手用户。本指南将详细介绍如何在OK交易平台上进行注册和使用,帮助新手用户快速上手。

在加密货币交易领域,交易所的安全性始终是用户关注的重点。2025年,经过多年的发展和演变,一些交易所凭借其卓越的安全措施和用户体验脱颖而出。本文将详细介绍2025年最安全的五大交易所,并提供如何避开黑U(黑客攻击用户)的实用指南,确保您的资金100%安全。

币安(Binance)是全球领先的加密货币交易平台之一,提供多种数字资产的交易服务。如果你正在考虑使用币安进行加密货币交易,本文将为你提供详细的安装和注册指南。

如果你是一位苹果手机用户,并且对加密货币交易感兴趣,那么你一定不能错过OKX欧易这个平台。OKX欧易作为全球领先的加密货币交易所之一,提供了多种数字资产的交易服务,涵盖了比特币、以太坊、莱特币等主流币种,同时还支持多种山寨币和新兴代币的交易。无论你是刚入门的投资者,还是经验丰富的交易者,OKX欧易都能够满足你的需求。下面我们将详细介绍如何通过苹果手机在OKX欧易官方网站上进行注

OKX 作为全球领先的加密货币交易平台,为用户提供了多样化的交易服务和安全的交易环境。自成立以来,OKX 凭借其强大的技术支持和丰富的交易产品,吸引了大量的用户和投资者。无论你是新手还是专业交易者,OKX 都能满足你的交易需求。

全球知名的数字货币交易平台,成立于2014年,致力于为用户提供安全、便捷的数字资产交易服务。作为一家国际化的交易所,易欧支持多种主流和小众数字货币的交易,吸引了来自世界各地的用户。无论是新手还是经验丰富的交易者,都可以在易欧平台上找到适合自己的交易工具和服务。

全球领先的加密货币交易平台,以其高效、安全和多样化的交易服务闻名于世。无论你是经验丰富的交易者还是初入加密货币市场的新手,币安Binance都能提供你所需的工具和资源。通过币安Binance网页版,用户可以轻松访问交易平台,无需下载任何应用程序,直接通过浏览器进行交易操作。本文将详细介绍如何进入币安Binance交易所网页版,并提供一些实用的交易技巧和注意事项。

OKX,原名欧易,是全球领先的加密货币交易平台之一,致力于为用户提供安全、高效、便捷的数字资产交易服务。作为一个成熟的交易平台,OKX不仅支持多种主流数字货币的交易,还提供包括期货、永续合约、杠杆交易等多种金融产品,满足不同用户的投资需求。OKX官网链接为用户提供了一个便捷的入口,通过访问官方网址,用户可以轻松地进行注册、登录、交易等操作。
