这不是浏览器问题,而是滥用数据结构。
数组是一组有序的对象。根据定义,javascript 集合/对象是无序集。ECMA 标准支持这一点。
chromium V8 项目有一个相对古老的问题,对该主题进行了长时间的讨论:http ://code.google.com/p/v8/issues/detail?id=164
它的要点是 Chrome 和 Opera(实际上是 IE9)正在对对象的数字键成员进行排序,并将它们放在任何具有字符串键的成员之前。在访问对象时这样做是出于效率原因,并且它在那些浏览器中按预期工作。FF 和 IE < 9 保留了不应排序的结构的顺序,虽然它们没有做错任何事情,但这种行为不如 Chrome、Opera 和 IE9 正确。
您基本上有三种方法可以在您的项目中解决此问题:
在您的数据上调用 array_values() 以使其非关联。当您对其进行 json_encode 编码时,默认情况下会将其编码为数组。然后该顺序将是它在 PHP 中定义的任何顺序。由于您不想丢失密钥,因此应将它们存储在对象数据中。这是首选的解决方案,并且最不可能长期中断。
定义您希望数据所在的顺序,并将其作为数组与对象数据一起传递。不如上面的那么好,因为您最终传递的数据比您真正需要的数据多,并且它将负担转移给了客户端。
将您的键转换为在每个键的开头或结尾带有一些字母字符的字符串。如果您正在处理遗留项目并且几乎无法控制您的架构,这只是一个不错的选择。
事实是,作为开发人员,您无法保证无序对象的顺序会被保留。随着网络标准朝着这个方向发展,ECMA 标准和未来标准草案继续制定规则,其他浏览器将转向这种行为。还不如现在调整。
故事的寓意:如果您需要保持秩序,请使用数组。