为什么Microsoft IE在插入/删除时改变对象的键顺序?
Why does Microsoft IE change the order of an object's keys on insertion/deletion?
对于Microsoft IE,如果插入一个键被删除且元素总数大于31的元素,则JSON对象的顺序将被颠倒。
迄今为止,此问题仅在IE中发生。 并且,在Chrome, Firefox, Safari和Opera中不会发生, 元素按插入顺序插入。
如果在不同的浏览器上使用不同的"count"值运行下面的测试代码,可能会出现这个问题。
<script>
var temp = {};
var count = 31;
add = function(){
for(var i=0; i<count;i++)
{
var id = "id:"+i;
var c = {};
c[id] = "value:"+i;
console.log("push at " + i + " = " + id);
_.extend(temp, c);
}
}
display = function(){
var i=0;
$.each(temp,function(key, value){
console.log("list at "+i+" = " + key);
i++;
});
}
deletion = function(){
var i=0;
$.each(temp,function(key, value){
console.log("delete at " + i+ " = "+key);
delete temp[key];
i++;
});
}
add();
display();
deletion();
add();
display();
</script>
请注意,当根据ECMA标准将元素推送到JSON对象时,顺序并不重要。
首先,这不是一个JSON对象,它是一个JS对象。JSON是一种序列化格式,用于传递包含编码数据的文本字符串;JS中的对象是一个实际的对象,而不是一个对象的字符串表示。
其次,JS对象(以及JSON对象)被显式定义为键值对的无序集合。您可以对它们进行迭代,但不能依赖于以任何特定顺序获取元素。JS的一个简单实现只是将每个新的键值对添加到列表的末尾。但这意味着无论何时访问一个特定的键,都必须搜索整个列表才能找到它;显然,对于具有大量键的对象,这将变得非常低效。因此,优化后的JS引擎会做一些更聪明的事情——它可能会按字母顺序存储键,这样它就可以对键执行二进制搜索;或者更有可能的是,它会使用一些哈希函数并按其排序,这样二分查找更有可能达到最佳效率。
对于小对象,有一个不同的效率问题:内存使用。理想情况下,一个对象应该占用一个连续的内存块,其两侧被其他对象或数据包围。当你添加更多键或更长的值时,对象的内存需要增长,将整个对象移动到更大的空间会很慢,并且在旧位置留下空隙,所以引擎需要做一些更聪明的事情。这可能包括预先分配额外的空间来生长,并重用删除项腾出的空间(同样,以最大化引擎效率的顺序)。
所有这些都将根据特定情况在引擎内部动态调整,这将包括键值对的数量和大小,甚至对象的用途。因此,在重复删除和插入的影响下,超过一定大小,现代浏览器会选择以相反顺序结束的策略,这一点也不奇怪。
底线是不要对对象中的键的顺序做任何假设。就你的代码而言,它们的有效顺序是随机的。
- 改变<svg>对象's路径
- 为什么日期对象的时间没有改变?我怎样才能改变它
- 为什么第二个对象的值没有改变
- 触发标准“;改变“;表单对象上的事件-由其上的任何侦听器拾取
- Javascript排序的数组会改变窗口对象,但在遍历它时不会改变
- 为什么函数中改变的对象会改变它们在内存中指向的内容,但有时会创建一个新的内存对象
- 如何将场景中的对象添加到网格中而不改变其在three.js中的位置
- 如何上传JSON文件在Javascript运行时创建对象,而不改变服务器端脚本
- 基于查看区域,使用javascript动态改变html对象中嵌入flash文件的大小
- 如何改变对象's html
- js -如何动态改变对象的不透明度
- 我可以动态地改变'likeable'对象用于Facebook的Like按钮
- 改变JavaScript对象定义样式会导致画布保持空白
- 为什么我的画布对象在setInterval()被调用后不改变颜色?
- 如何使D3js对象改变它的属性,鼠标移动到对象附近
- 为什么我的innerHTML对象没有改变时分配
- 对象的属性在改变时激活功能
- 如何用JSONLoader改变在js中加载的对象的颜色
- 如果我们创建新的原型属性,对象会改变它的隐藏类吗?
- 当引用对象改变时,react .js视图不更新