javascript对象中字段的顺序在循环时是可预测的吗?
在php中,如果您有以下代码:javascript对象中字段的顺序在循环时是可预测的吗?,javascript,language-features,Javascript,Language Features,在php中,如果您有以下代码: $map = array( "first" => 1, "second" => 2 ); $map["third"] = 3; foreach($map as $key => $value) { // code } 您知道,条目将按照添加到数组中的顺序列出 现在,我可以假设同样的规则适用于下面的Javascript等价物吗 map = { "first": 1, "second": 2 }; map["third"]
$map = array(
"first" => 1,
"second" => 2
);
$map["third"] = 3;
foreach($map as $key => $value) {
// code
}
您知道,条目将按照添加到数组中的顺序列出
现在,我可以假设同样的规则适用于下面的Javascript等价物吗
map = {
"first": 1,
"second": 2
};
map["third"] = 3;
for (key in map) {
// code
}
这是的副本:否,行为取决于实现,不保证。当需要保留顺序时,请使用数组。大多数浏览器都会按照属性添加到对象的顺序遍历属性,但Javascript标准表示顺序未定义,因此不应依赖此行为。例如,我不久前读到过关于Google Chrome不总是表现出这种行为的文章
如果您需要有序功能,您应该为自己创建一个可以同时使用对象键或数字键的新类。是,但是(在标准中):“枚举属性的机制(第一个算法中的步骤5,第二个算法中的步骤6)取决于实现。枚举顺序由对象定义。”因此枚举本身依赖于实现,但顺序依赖于对象,不是吗?@Julian:ECMA-262的下一版本3.1不那么含糊不清:“枚举属性的机制和顺序[…]没有指定。”非常感谢链接。John所说的是,尽管它不是标准的,但浏览器供应商应用它的时候就好像它是标准的一样(所以Chrome团队将修复“bug”)。是的。尽管我仍然认为你不应该依赖这种行为。更安全的做法是创建一个自定义类,您可以在其中自己定义行为