一、前言 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语句的机制。
相关推荐:
seo高手有什么条件,seo难上手吗 ,指南ai写作电力创新
ChatGPT无法使用?了解原因及解决方法,轻松恢复智能对话体验!,ai满版图案
AI优化文章:如何利用人工智能提升写作效率和质量
seo网站反链是什么,网站反链怎么做 ,ai插画头像卡通
seo简报什么意思,seo工作汇报 ,万花筒 ai
乘风SEO:突破困境,领航网络营销新时代,武汉靠谱的关键词排名
SEO外包:提升网站排名与品牌曝光的最佳选择,大创建设网站
企业营销:如何在竞争激烈的市场中脱颖而出,美装网站Seo优化
SEO自行:提升网站流量的秘密武器,邹平县个人网站建设建议
ChatGPT无法加载?检查您的网络设置并尝试重启,轻松解决常见问题!,ai招生广告设计
SEO桔子:提升网站排名的必备法宝,seo外包销售
文字生成AI开启创作的新纪元
chatai写作免费一键生成,轻松解决写作难题!,陈逗逗ai换脸在线看
什么叫改写-解读“改写”背后的艺术与技巧,网站制作建设模板图片
SEO是什么意思?揭秘SEO的真正含义与重要性,公司推广网站询问d火18星来
优化网站的秘诀:提高网站速度与用户体验,助力业务腾飞,旅游网站建设步骤
中国AI软实力崛起:技术创新与产业应用的完美融合,seo0066
亚马逊seo信息是什么,亚马逊seo关键词优化软件 ,光谷ai
如何识别文章是否由AI撰写?揭开智能写作的秘密
ChatGPT403:引领人工智能新时代,颠覆你的工作与生活方式,ai nak
ChatGPT回答是空白的背后,究竟隐藏着什么秘密?,如何用ai写作来赚钱
用AI生成的文章算原创吗?深度解析AI写作背后的秘密
京东业绩再创新高:未来电商巨头的成功之道,如何做seo优化留痕
ChatGPT中文版下载,开启智能对话新体验,婚纱ai男
常用AI工具,高效智能生活
《SEO教材:打造网站流量的核心利器,教你轻松SEO优化技巧》,咖啡网站建设总结文案
SEO出超:如何通过精准优化实现网站流量大爆发,营销推广方式联系f火15星
seo独立站是什么,独立站推广是什么 ,ai曲线笔刷扩展
ChatGPT启动时遇到问题?快速解决方案让你畅享智能对话体验,ai如何保存logo
SEO搜外:全球搜索引擎优化的秘密武器,如何选择网站建设类型呢
AI缩写在线:让人工智能助力你行业前沿技术,ai uhrehara
seo网络培训是什么,seo工作培训会培训啥 ,ai长投影字
SEO导流:如何通过精准优化实现网站流量大爆发,网站优化优化怎么做
AI代写文章:高效创作的新风尚
seo,seoul city ,ai精洗
seo自己做什么,自己做seo需要花钱吗 ,ai850775
AI提供的阅读书目对学生的专业知识有多大帮助,沃奇ai
AI撰写大数据解决方案:开启智能数据时代的新篇章,ai头号公敌
用AI批量下载工具,高效管理你的文件和资源
AI工具汇总网站,让科技为您的工作加速
SEO走动:提升网站流量的关键一步,SEO数据监控宝宝推荐
SEO优化要钱吗?揭秘SEO投资背后的价值与回报,ai领域
SEO领站-从零到一打造成功网站排名的秘密,轻淘客seo怎设置
SEO项目:如何通过精确优化提升企业网站排名与转化率,武汉做网站优化的公司
SEO要求:如何优化网站提升搜索引擎排名,助力企业获取更多流量,鹤山区网站运营推广
SEO表述:如何通过精准优化让你的内容脱颖而出,江阴网站建设怎么样啊
什么是seo在线咨询,什么是seo在线咨询服务 ,unreal ai
GPT怎么收费?揭秘AI技术的定价与价值,ai报考高考
在线AI文章:为您打造全新内容创作体验
SEO优化如何进行:提升网站排名,轻松超越竞争对手,ai写作怎么操作手机