Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

对象的键应该是有序的,然而——

  在 ES3 中,JavaScript 对象的键被强调定义为无序的,使用起来造成了各种不便;而到了 ES5 则去掉了这个定义,完全没有定义就带来了更大的问题。直到 ES6,对象属性的排序终于被定义成了有序的。虽然现代浏览器看起来和规范比较像,但实际实现情况还完全没跟上步伐。
  以前纠结 for-in 的细节 时就讨论过这个问题。其实这个坑并不大,因为现代浏览器早已对属性按照创建的顺序来遍历,只是一直缺个规范而已。如今 ES6 sec-9.1.12 中将这个定义补上可谓是圆满了。
  不过如果仔细推敲这个定义就会发现目前的浏览器实现是呵呵的。规范中定义的是将「integer index」的属性优先以升序排列,这个「integer index」在 ES6 sec-6.1.7 中定义为 0 到 pow(2,53)-1 这个闭区间上的值。然而在目前最新版 Chrome 上的实现中,这个区间是 0 到 pow(2,32)-1 <script>
// Test in Chrome 45
var obj1 = Object.keys({ 4294967295: 'a', 4294967294: 'b' });
var obj2 = Object.keys({ 4294967296: 'a', 4294967295: 'b' });
document.write(obj1[0] < obj1[1]); // true
document.write('<hr/>');
document.write(obj2[0] < obj2[1]); // false
</script>
  而在 Firefox 中这个设定和其优化方式有很大关系,比如下面这个神奇的区间 <script>
// Test in Firefox 40
var obj1 = Object.keys({ 999: 'a', 998: 'b' });
var obj2 = Object.keys({ 1000: 'a', 999: 'b' });
document.write(obj1[0] < obj1[1]); // true
document.write('<hr/>');
document.write(obj2[0] < obj2[1]); // false
</script>
  或者再看下面就是个大坑了 <script>
var a = {};
for(var i = 1000; i > 0; i--) a[i] = i;
// Chrome 45 顺序输出
// Firefox 40 倒序输出
document.write(Object.keys(a).join(' '));
</script>
  总之,目前浏览器的实现还是没鸟 ES6 的,还是完全按照 ES3 中的「无序」来,完全随自己内部存储的优化方式来输出。不过我想将来这个神奇的特性终究会统一的吧?
网名:
34.203.213.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^