JavaScript数组对象

5

http://jsfiddle.net/gfuKS/5/

var transitionInitial = {property: "none"};
var rules = ["color", "background-color"];
var transitions = [];
for ( var k = 0; k < rules.length; k++)
{
    transitions[k] = transitionInitial;
    transitions[k].property = rules[k];
    alert(transitions[0].property);
}​

为什么在第二次迭代中transitions[0].property等于"background-color"?
3个回答

10
因为您存储的是对transitionInitial的引用,而非其副本。transitionInitial指向内存中的一个对象,并且您正在将对该对象的引用存储在transitions[k]中。无论您处于哪个迭代位置,您始终都在更改同一对象。

3
这是因为您的transitions数组中的两个值指向同一个对象。在代码执行期间,您创建了一个具有三个不同引用的对象(transitionInitial, transistions[0]transistions[1])。
在循环的第一次迭代中,将transitions[0]设置为引用transitionInitial对象。然后将该对象的property属性设置为值"color"。在第二次迭代中,将transitions[1]设置为引用与transitionInitialtransitions[0]相同的对象。您随后将property的值重置为"background-color"
要解决这个问题,请为数组索引创建不同的对象:
// Not needed anymore:
// var transitionInitial = {property: "none"};
var rules = ["color", "background-color"];
var transitions = [];
for ( var k = 0; k < rules.length; k++) {
  transitions[k] = {};
  transitions[k].property = rules[k];
  alert(transitions[0].property);
}​

0

可能与此有关吗?for ( var k = 0; k < rules.length; k++) 尝试更改计时器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接