js for in 在各浏览器差异

js for in 在各浏览器差异

var obj = { 

2   2:"2", 

3   40:"40", 

4   15:"15", 

5 }; 

6 for (var k in obj) { 

7     console.log(k);  

8 };

 

ie6/7/8/firefox/safari
2
40
15

ie9/chrome10/opera11
2
15
40

即ie9/chrome10/opera11中不是按定义时的顺序输出的。for in规则参考ecmascript5 12.6.4。

引用the mechanics and order of enumerating the properties (step 6.a in the first algorithm, step 7.a in the second) is not specified
v5已经不再规定for..in的顺序了,所以chrome咋整都没问题
chrome的算法如下:
1、对所有key计算parsefloat的结果
2、将parsefloat为0或正整数的提取出来,从小到大输出
3、将剩下的,按定义顺序输出

ie9我没自己看,好像记得有人说(好像就是教主同志)ie9的顺序和chrome是一样的

另外ie6-8的一个问题:
var o = {};
o['a'] = 1;
o['b'] = 2;
o['c'] = 3;
delete o['a'];
o['a'] = 4;
for (var key in o) {
console.log(key);
}
ie是a-b-c,其他浏览器是b-c-a
如果说一个object里有一个keytable和一个valuetable的话,ie对delete的理解是,把key对应的valuetable里的项砍掉,但keytable保留着,大概就是做了个记号[[deleted]],因此导致再次定义这个key的时候,顺序保持了原来的 
@gray zhang
ie9果然和chrome一样。已修改,谢谢。

有两点:
1,所说chrome算法貌似不对,示例
var obj = {
"1a":"1a",
2:"2",
40:"40",
15:"15"
};
for (var k in obj) {
console.log(k);
};

chrome下输出 2,15,40,1a。按你所列步骤应该是 1,2,15,40

2,ie6/7/8/9中以下代码都输出a,b,c
var o = {};
o['a'] = 1;
o['b'] = 2;
o['c'] = 3;
delete o['a'];
o['a'] = 4;
for (var key in o) {
console.log(key);
}  

时间: 2024-11-05 15:06:40

js for in 在各浏览器差异的相关文章

js中for in遍历json数据顺序各浏览器差异

了解W3C标准:     根据 ECMA-262(ECMAScript)第三版中描述,for-in 语句的属性遍历的顺序是由对象定义时属性的书写顺序决定的.     关于 ECMA-262(ECMAScript)第三版中 for-in 语句的更多信息,请参考 ECMA-262 3rd Edition 中 12.6.4 The for-in Statement.     在现有最新的 ECMA-262(ECMAScript)第五版规范中,对 for-in 语句的遍历机制又做了调整,属性遍历的顺序是

javascript for-in有序遍历json数据并探讨各个浏览器差异_javascript技巧

object本身就是无对象的集合,因此在用 for-in 语句遍历对象的属性时,遍历出的属性顺序与对象定义时不同. 了解W3C标准: 根据 ECMA-262(ECMAScript)第三版中描述,for-in 语句的属性遍历的顺序是由对象定义时属性的书写顺序决定的. 关于 ECMA-262(ECMAScript)第三版中 for-in 语句的更多信息,请参考 ECMA-262 3rd Edition 中 12.6.4 The for-in Statement. 在现有最新的 ECMA-262(EC

Threejs 官网 - 检测使用 three.js 时的 WebGL 和浏览器兼容性(Detecting WebGL and browser compatibility with three.js)

检测使用 three.js 时的 WebGL 和浏览器兼容性(Detecting WebGL and browser compatibility with three.js) 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章

JS函数为定义问题,浏览器老是显示函数fun2( )未定义

问题描述 JS函数为定义问题,浏览器老是显示函数fun2( )未定义 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>改变图案的形状和颜色</title> <script type="text/javascript"> function fun1(){ document.body.innerHTML = &quo

unity web调用js方法打开网页被浏览器拦截

问题描述 unity web调用js方法打开网页被浏览器拦截 unity web调用js方法打开网页被浏览器拦截 赞测360和遨游会拦截,ie没事,求大神指导

JS判断是否360安全浏览器极速内核的方法_javascript技巧

本文实例讲述了JS判断是否360安全浏览器极速内核的方法.分享给大家供大家参考.具体分析如下: 360安全浏览器极速内核,在非360网站的navigator.userAgent是: "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",用的全是原生的谷歌浏览器的userAgent: 而360自己的网站的navigator.u

js停止冒泡和阻止浏览器默认行为的简单方法_javascript技巧

停止冒泡通用方法: function stopBubble(e) { //如果提供了事件对象,是非IE浏览器 if ( e && e.stopPropagation ) //使用W3C的stopPropagation()方法 e.stopPropagation(); else //使用IE的cancelBubble = true来取消事件冒泡 window.event.cancelBubble = true; } 阻止浏览器默认行为-通用方法 //阻止浏览器的默认行为 function s

JS判断是否在微信浏览器打开的简单实例(推荐)_javascript技巧

最近做很多HTML5的项目,很多页面会通过微信微博等SNS分享出去.在分享页面上提供公司APP的下载.但是在很多应用的浏览器中,点击下载链接无法下载应用.那么针对这些浏览器我们需要给用户提示从safari或者系统自带的浏览器打开分享页面.通过js就可以判断当前页面是在什么浏览器打开的. 以下是一段示例代码,注释中表明了通过JS如何判断是否在微信浏览器打开,是否在QQ空间浏览器,是否在新浪微博打开.当然可以做得更完善一点,再加上判断是在移动设备打开还是在PC端浏览器打开的,更加细分一点,可以判断是

JS获取当前使用的浏览器名字以及版本号实现方法_javascript技巧

工作中需要通过JS去获取当前使用的浏览器的名字以及版本号,网上大堆资料都有一个关键词是 navigator.appName,但是这个方法获取的浏览器的名字只有两种要么是IE要么就是Netscap,倒是可以用来判断是否使用了IE,但是我想获取具体的浏览器产品名字比如  Firefox,Chrome等.所以只好通过navigator.userAgent,但是这个字符串是非常长的,分析他的特征,通过正则表达式来解决这个问题是不错的方法. (1) 获取浏览器名字+版本字符串 function getBr