Javascript 为什么我的在线用户数量没有达到1?

Javascript 为什么我的在线用户数量没有达到1?,javascript,Javascript,为什么用户联机状态在以下情况下总是未定义: 函数countOnlineusersObj{ var c=0; usersObj{ log[user]['online']; 如果[user]['online']==true{c++} } 返回c } 调试器; 在线计数{ 艾伦:{online:false}, 杰夫:{online:true}, 莎拉:{online:false} }; 这是因为用户是对象的键,所以应该是这样的 for(let user in obj) console.log(obj

为什么用户联机状态在以下情况下总是未定义:

函数countOnlineusersObj{ var c=0; usersObj{ log[user]['online']; 如果[user]['online']==true{c++} } 返回c } 调试器; 在线计数{ 艾伦:{online:false}, 杰夫:{online:true}, 莎拉:{online:false}
}; 这是因为用户是对象的键,所以应该是这样的

for(let user in obj) console.log(obj[user]['online'])

这是因为用户是对象的键,所以应该是这样的

for(let user in obj) console.log(obj[user]['online'])

循环仅迭代对象Alan、Jeff、Sarah的属性名。在执行每个迭代时,您可以访问属性名称,但随后必须将该名称作为索引传递到对象中,以便提取该对象中该属性的值

因此,必须将用户变量传递到usersObj对象中。例如:obj[Alan][online]将返回false。但您的代码实际上只是尝试执行[Alan][online],而这不会返回任何内容,因为它没有指定要查看的对象,因此它最终会尝试在window对象中查找它,而window对象是浏览器中的全局对象,并且由于window.Alan不存在,因此未定义

而且,由于函数中有一个返回值,如果需要该值,则必须准备在调用函数时捕获该值

函数countOnlineusersObj{ var c=0; usersObj{ console.logusersObj[user]['online']; 如果UsSersObj[Up] [OnLeal],=真{ C++,} } 返回c; } 调试器; console.logcountOnline{ 艾伦:{online:false}, 杰夫:{online:true}, 莎拉:{online:false}
}; 循环仅迭代对象Alan、Jeff、Sarah的属性名。在执行每个迭代时,您可以访问属性名称,但随后必须将该名称作为索引传递到对象中,以便提取该对象中该属性的值

因此,必须将用户变量传递到usersObj对象中。例如:obj[Alan][online]将返回false。但您的代码实际上只是尝试执行[Alan][online],而这不会返回任何内容,因为它没有指定要查看的对象,因此它最终会尝试在window对象中查找它,而window对象是浏览器中的全局对象,并且由于window.Alan不存在,因此未定义

而且,由于函数中有一个返回值,如果需要该值,则必须准备在调用函数时捕获该值

函数countOnlineusersObj{ var c=0; usersObj{ console.logusersObj[user]['online']; 如果UsSersObj[Up] [OnLeal],=真{ C++,} } 返回c; } 调试器; console.logcountOnline{ 艾伦:{online:false}, 杰夫:{online:true}, 莎拉:{online:false}
}; 下面是代码的解决方案

首先,您使用括号符号访问对象,这是最佳做法,并且您使用for in循环和检索对象的键,使用console.loguser对其进行双重检查。您获得了密钥,但要访问该密钥的值,因为它是一个对象,您需要执行usersObj[user]['online'],它将根据给定对象为您提供true或false的值

检查下面的完整解决方案

函数countOnlineusersObj{ var c=0; usersObj中的forlet用户{ console.logusersObj[user]; 如果usersObj[user]['online']==true{ C++ } }返回c };
下面是代码的解决方案

首先,您使用括号符号访问对象,这是最佳做法,并且您使用for in循环和检索对象的键,使用console.loguser对其进行双重检查。您获得了密钥,但要访问该密钥的值,因为它是一个对象,您需要执行usersObj[user]['online'],它将根据给定对象为您提供true或false的值

检查下面的完整解决方案

函数countOnlineusersObj{ var c=0; usersObj中的forlet用户{ console.logusersObj[user]; 如果usersObj[user]['online']==true{ C++ } }返回c };
[user]应该是usersObj[user][user]['online']需要是usersObj[user]['online'].@Barmar你能解释为什么会这样,因为如果我使用console.loguser,它一次显示一个正确的用户Alan,Jeff,Sarah,,,那么为什么用户[online]不能工作。user是一个类似Alan的字符串。[user]是包含该字符串的数组。这不是usersObj[Alan][user]的值应该是usersObj[user][user][online']需要是usersObj[user][online'.@Barmar你能解释为什么会这样,因为如果我使用console.loguser,它会一次显示一个正确的用户Alan,Jeff,Sarah,,,那么为什么user[online]无法工作。user是一个类似Alan的字符串。[user]是包含该字符串的数组。这不是usersObj的值[Alan]你还需要修正if语句。你还需要修正if语句。这是欢迎并保持下去的最佳实践:染料当然@scottMacrus,但还有程序员
使用点表示法而不是括号表示法的s,这将在以后影响,甚至不知道问题来自于表示法本身。这是欢迎并保持的最佳实践:染料肯定@scottMacrus,但是有些程序员使用点符号而不是括号符号,这会影响到以后,甚至不知道问题来自于符号方式本身。