记录对象显示所有属性,但单独记录属性显示“未定义”

时间:2018-02-14 08:49:47

标签: javascript object for-loop javascript-objects

我正在尝试移植我为Javascript构建的PHP函数,并且发现了很多差异导致了很多额外的工作。我被困在这一个上,找不到任何逻辑:
X:95.29
Y:27.39
testParse2.RXdec:0.1

 var curPos={};
 curPos={};
 console.log(curPos);       //X:97.19 Y:27.39 (I expect an empty object)
 console.log(curPos['X']);  //undefined (seems ok but makes no sense with above)
 console.log(curPos['Y']);  //undefined (seems ok but makes no sense with above)

   for(var Ri=0; Ri < 20; Ri++){    

     curPos['X'] = "";
     curPos['Y'] = "";
 console.log(curPos['X']);  // "" (seems ok)
 console.log(curPos['Y']);  // "" (seems ok)
 console.log(curPos);       //X:97.19 Y:27.39
     curPos.X = (((XY(lastPos[AV['A']], 'X')*1)+(testParse2.RXdec*1*Ri)).toFixed(10)*1);
     curPos.Y = (((XY(lastPos[AV['B']], 'Y')*1)+(testParse2.RYdec*1*Ri)).toFixed(10)*1);
 console.log(curPos);   // X:97.19 Y:27.39 (I expect X:95.29 + 0.1 each loop Y:27.39)
 console.log(curPos.X); // 95.29 (correct by why is above different?)
 console.log(curPos.Y); // 27.39 (correct by why is above different?)

}

让我最困惑的是:

  1. curPos在循环开始之前获取一个值。价值是 curPos在最后一次迭代后应具有的值。

  2. 在循环期间,curPos和curPos.X或.Y的控制台日志没有 包含相同的值。

  3. 在循环期间,尽管每次迭代都更改.X和.Y,但curPos的控制台日志始终相同

  4. 编辑:@str给出了控制台故障的正确解释,但似乎这个问题超出了控制台并实际影响了对象值。 使用JSON.strigify后我可以看到这个(这很好):

    console.log(JSON.stringify(testParse2));
    "Xdec":97.99
    "Xdec":98.09
    "Xdec":98.19
    

    但现在我尝试将数据传输到最终数组,但最终数组填充了'lazy'值:

    T['tool'][T['curTool']]['points'][lineID] = testParse2;
    
    console.log(JSON.stringify(T));
    "Xdec":98.19,"Ydec":27.39,"curX":323.19,"curY":177.39
    "Xdec":98.19,"Ydec":27.39,"curX":323.19,"curY":177.39
    "Xdec":98.19,"Ydec":27.39,"curX":323.19,"curY":177.39
    

    如果我在循环中停止使用对象并切换到变量,那么构建我的最终数组就可以了:

     T['tool'][T['curTool']]['points'][lineID] = {'curX' : curX,
                                                  'curY' : curY,
                                                  'TYP'  : 'DR',
                                                  'lineID'   : lineID,
                                                  'lineName' : lineName,};
    

    如何将循环的特定迭代中的实际对象值发送到不同的数组?

1 个答案:

答案 0 :(得分:4)

浏览器在记录时懒惰地评估对象。因此,当您在循环之后展开它们时,它们将在展开时显示它们的属性,而不是在记录对象时它们拥有的属性。

您可以使用

验证
console.log(JSON.stringify(curPos));

而不是

console.log(curPos);