我在javascript中有关于foreach的问题
我在javascript中使用了以下数组:
puntos":{"2":"punto dos","3":"punto tres","4":"punto cuatro","5":"punto cinco","1":"punto uno"}
如果我想做一个foreach,我会使用以下内容:
for (var k in puntos){
if (puntos.hasOwnProperty(k))
{
console.log("Key is " + k + ", value is" + puntos[k]);
}
}
安全性:
puntos":{"2":"punto dos","3":"punto tres","4":"punto cuatro","5":"punto cinco","1":"punto uno"}
输出结果为:
Key is 1, value ispunto uno
Key is 2, value ispunto dos
Key is 3, value ispunto tres
Key is 4, value ispunto cuatro
Key is 5, value ispunto cinco
我的问题是为什么当我迭代数组(puntos)时,foreach改变了我的数组的安全性?
安全性:
puntos":{"2":"punto dos","3":"punto tres","4":"punto cuatro","5":"punto cinco","1":"punto uno"}
预期输出
Key is 2, value ispunto dos
Key is 3, value ispunto tres
Key is 4, value ispunto cuatro
Key is 5, value ispunto cinco
Key is 1, value ispunto uno
答案 0 :(得分:1)
一个有趣的"为什么?"。
您创建的对象:
var a = {"puntos":{"2":"punto dos","3":"punto tres","4":"punto cuatro","5":"punto cinco","1":"punto uno"}};
将自动重新排序密钥:
console.log(a)
Object {1: "punto uno", 2: "punto dos", 3: "punto tres", 4: "punto cuatro", 5: "punto cinco"}
但为什么会这样呢?
谷歌搜索 - 提及Chrome问题here,其中讨论了这种行为的起源。因为这样的浏览器确实不尊重对象内元素的排序,甚至相同浏览器的不同版本也可以产生不同的结果,仅仅因为没有关于这种排序的ECMAScript标准。现在 - 目前的情况 - 从经过测试的浏览器,IE11,Chrome,Firefox,Opera,所有这些都遵循相同的重新排序数字索引的模式。所有人都遵循"不要重新排序"文字索引。
而且 - 做什么:
.replace(/"(\d)*":/g, function(){ return '"_'+arguments[1]+'":' })
答案 1 :(得分:0)
如果你真的想要它们,你可以使用这样的非数字键:
var puntos = {"p2":"punto dos","p3":"punto tres","p4":"punto cuatro","p5":"punto cinco","p1":"punto uno"};
尽管ECMAScript规范说不能保证对象属性的顺序,但实际上所有引擎都保留了顺序,除非你使用数字键,在这种情况下,某些引擎将sort the keys numerically正如你所注意到的那样。
将它们存储在实际数组中但使用无序键的另一种方法是使用对象数组:
var puntos = [
{
key: "2",
value: "punto dos"
},
{
key: "3",
value: "punto tres"
},
{
key: "4",
value: "punto cuatro"
},
{
key: "5",
value: "punto cinco"
},
{
key: "1",
value: "punto uno"
}
];