Javascript JS奇怪的错误:无法读取未定义的属性

Javascript JS奇怪的错误:无法读取未定义的属性,javascript,json,xmlhttprequest,Javascript,Json,Xmlhttprequest,用代码描述问题。为什么会这样 var response = JSON.parse(xhr.responseText); console.log(response[0].conversationUsers.length); //OK, console outputs "2" for (i = 0; i < response.length; i++) { for (j = 0; j < response[i].conversationUsers.length; j++) { //

用代码描述问题。为什么会这样

var response = JSON.parse(xhr.responseText);
console.log(response[0].conversationUsers.length); //OK, console outputs "2"
  for (i = 0; i < response.length; i++) {
  for (j = 0; j < response[i].conversationUsers.length; j++) { //Error 'cannot read property', but it has to be interpreted "j = 0; j < 2; j++" and it worked in console.log
          ...
        }
      }
var response=JSON.parse(xhr.responseText);
console.log(响应[0].conversationUsers.length)//好,控制台输出“2”
对于(i=0;i
UPD。我添加了临时变量,它可以工作

for (j = 0; j < response[i].conversationUsers.length; j++) //this way doesn't work

var temp = response[i].conversationUsers;
for (j = 0; j < temp.length; j++) //this way works
(j=0;jfor//这种方式不起作用 var temp=响应[i]。会话用户; 对于(j=0;j
问题可以关闭,但您知道为什么吗?

您正在尝试在长度属性内部迭代。尽量减少长度。像这样

    var response = JSON.parse(xhr.responseText);
    console.log(response[0].conversationUsers.length);
    for (i = 0; i < response; i++) {
      for (j = 0; j < response[i].conversationUsers; j++) {
          ...
      }
    }
var response=JSON.parse(xhr.responseText);
console.log(响应[0].conversationUsers.length);
对于(i=0;i
仅对该数组中的第一个对象使用
console.log()
。我建议你试试:

var response = JSON.parse(xhr.responseText);
for (i = 0; i < response.length; i++) {
  console.log(response[i].conversationUsers); // should be an array
  for (j = 0; j < response[i].conversationUsers.length; j++) {
          ...
  }
}
var response=JSON.parse(xhr.responseText);
对于(i=0;i
如果您的控制台中有任何未定义的
,则在执行此操作时,您已经确定了您的问题


问题是,对于数组
响应[0]中的第一个元素,conversationUsers
的值是数组。对于该数组中的每个元素,这可能不是真的,因此其中一些元素可能没有length属性。

一个XmlHttpRequest中的xhr.responseTextResponse是什么。我像往常一样收到了响应字符串,然后将其解析为JSON格式并保存到“response”中。显然,响应中的所有元素都有ConversationUsers。当您对
I
j
使用全局变量时,我假设内部循环中有某种东西在改变变量
I
。您应该始终为迭代器使用局部变量(
for(var i=0;…
或更好的
for(let i=0;…
)@JJJ我猜OP实际上并没有定义变量,也不明白如果没有
var
let
、或
const
,变量实际上是全局定义的。我曾经去过一次。所以,@AlexeyBabanskyi如果你没有在其他任何地方使用
I
j
,你需要使用其中一个我之前说过的E3关键字,用于限定变量的范围,而不是使其成为全局变量。这是一种很好的做法,有助于避免错误。我同意这一点。显然,
response
是一个对象数组。仅仅因为第一个对象有一个值为数组的conversationUsers键,并不意味着第二个、第三个或第四个是数组。我不理解明白为什么你被否决了。我正在投票(把它提高到0…)。如果你把一个答案放在一起,如果你的陈述是正确的,你可能会得到更多的选票,因为目前它只帮助调试问题,但实际上并不能解决问题。如果你这样做,也可以在这些
循环中抛出
var
来演示好的代码(我知道你抄袭了OP)。因为你的答案不正确,你被人们否决了。你不能将一个数字与一个数字以外的任何东西进行比较(基本上,你只是说做
0<[]
)。中间条件需要包括
长度
,以便循环比较两个数字。在发布代码之前,您应该尝试一下。如果您尝试过,您会发现它不起作用。