【问题标题】:Logging objects shows all properties but logging the properties individually shows 'undefined'记录对象显示所有属性,但单独记录属性显示“未定义”
【发布时间】:2018-07-24 18:41:43
【问题描述】:

我正在尝试将我构建的 PHP 函数移植到 Javascript,并且发现了许多导致大量额外工作的差异。我被困在这个问题上,找不到任何逻辑:
X:95.29
年: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. 在循环期间,curPos 的控制台日志始终相同,尽管每次迭代都会更改 .X 和 .Y

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

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

但现在我尝试将数据传输到其最终数组,但最终数组填充了“惰性”值:

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,};

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

【问题讨论】:

  • 在第 3 行中,如果 curPos 不为空,那么您没有向我们展示某些内容(并且显然看不到您自己)。鉴于该代码,它确实是一个空对象。您的第 2 行是多余的,您已经在第 1 行中这样做了。在var 语句之前 检查curPos 的值。哦,在console.log 语句中使用JSON.stringify(curPos) 来立即评估对象的属性值!
  • ^^ 那。如果您只执行您显示的代码的前 5 行(在新窗口中),您将获得预期的结果。
  • 我建议您熟悉浏览器中的交互式 JavaScript 调试器,而不是仅依赖于 console.log() 语句。您可以在任何行上设置断点并立即查看所有变量和对象。然后你可以单步执行代码,看看每一步会发生什么。通过这种方式,您可以立即获得有关代码实际功能的信息,而不必猜测以及哪些特定的 console.log() 调用可能有用。
  • 你初始化一个对象而不是一个数组。您无法通过 curPos['X'] 获取值,您必须先将其转换为对象。除此之外,您还有其他一些问题,您再次使用 curPos={};在不需要的 var 之后。
  • 要使用调试器,首先将所有代码移动到一个函数中并调用该函数。这样做的原因是让你只看到你的局部变量,而没有全局命名空间的混乱。然后在函数顶部添加debugger; 语句;代码将停在那里,之后您可以单步执行。

标签: javascript object for-loop javascript-objects


【解决方案1】:

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

您可以通过使用验证这一点

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

而不是

console.log(curPos);

【讨论】:

  • 这是正确的。现在我可以看到正确的控制台输出,明天我将尝试让我的代码再次运行。
  • stackoverflow.com/questions/4057440/… 如果有人在展望未来,这是我在获得正确关键字后发现的另一个问题。它对不同浏览器中的 Javascripts 控制台行为和 webkit“错误”的可能性有非常详细的答案。
  • 我更新了我的问题。此问题不仅限于控制台输入。你有更多的见解吗?目前我从对象更改为普通变量,并且可以运行我的程序。
  • @Nama 请添加一个完整示例。什么是testParse2,什么是T
猜你喜欢
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
相关资源
最近更新 更多