JavaScript 属性返回 undefined

3
我从一个 Web 服务中检索到了一些数据,现在可以将这个对象打印到控制台中。
data.cashiers.forEach(c => {
    console.log('c is ' + c);
    console.log('c.name is ' + c.name);
    $('#sales_entry_cashier').append(new Option(c.name, c.uid));
});

奇怪的是,它完整地打印了c,但拒绝说c.name有一个值,如下所示:

c is {"uid":"6a661e7d-61a7-477f-b69c-f328b06819a3","name":"Admin"}      sales.js:87
c.name is undefined                                                     sales.js:88

然后,当它尝试附加名称和uid时,它当然会崩溃。我该怎么办?很明显,在输出的Object中,有c.name,即“Admin”-为什么我无法访问该属性?


也许其他代码正在使用引用更新对象。尝试在 console.log 之前放置 Object.freeze(c)。如果代码的其他部分正在更改对象,它将抛出错误。 - lmarqs
3
@lmarqs — 无法出现这种情况:这两个语句是连续和同步的,期间没有其他代码可以更新它们之间的内容。 - Quentin
1
在日志记录时不要连接字符串。console.log支持多个参数;console.log("c is", c);以及console.log("c.name is", c.name)将分别为每个参数执行输出格式化。您会注意到,c将被格式化为一个字符串。 - Sebastian Simon
@SebastianSimon 一条非常好的建议,我会牢记在心!谢谢! - corsiKa
你需要先解析对象。 - zb22
1个回答

5

您确定它是一个对象而不是序列化的吗?

首先检查响应中的类型。

console.log(typeof c)

如果是字符串,则进行反序列化处理

c = JSON.parse(c)

从那里开始。

编辑:确认它是一个字符串。

data.cashiers.forEach(c => {
    c = JSON.parse(c)
    $('#sales_entry_cashier').append(new Option(c.name, c.uid));
});

那么你的意思是它可能只是一个看起来像JSON对象的字符串?我会调查一下。 - corsiKa
1
是的,我99%确定它是一个字符串,因为你正在将它与一个字符串连接起来,而不是显示"[object Object]",它显示了整个对象。 - Uzair Ashraf
这是一个有用的观察,解释了为什么它没有打印出“object object”...我会记住的。我是一个Java程序员,现在被困在一些前端开发中,这方面的经验要少得多。除了答案之外,我也很感激你的解释。 - corsiKa
1
确实,那解决了问题。我稍微修改了一下,以免重新分配“c”变量,就像这样:data.cashiers.forEach(raw => { let c = JSON.parse(raw); 但最终结果是相同的。 - corsiKa
@corsiKa 只是一个小的侧面说明:现代大多数浏览器在尝试记录它们时,将不再在控制台中打印“[object Object]”。它们实际上会向您显示对象及其内容。只是这样说,以免您对结果感到困惑,当您期望它有所不同时。 - icecub
显示剩余3条评论

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