Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript对象中字段的顺序在循环时是可预测的吗?_Javascript_Language Features - Fatal编程技术网

javascript对象中字段的顺序在循环时是可预测的吗?

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"]

在php中,如果您有以下代码:

$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”)。是的。尽管我仍然认为你不应该依赖这种行为。更安全的做法是创建一个自定义类,您可以在其中自己定义行为