Uncaught TypeError: Cannot read property 'foo' of undefined

Uncaught TypeError: Cannot read property 'foo' of undefined

我正在与维基百科媒体一起做一个项目 API。我正在使用 Jquery 查询 API。如本代码笔 http://codepen.io/jowze/pen/NNZNKY/?editors=1010

所示,在 Chrome 中检查开发人员控制台时,以下请求有效
$.ajax({
 url:'https://en.wikipedia.org/w/api.php',
  data: { action : 'query', generator: 'search', gsrnamespace : '0', gsrlimit : '10', prop : 'extracts', pilimit: 'max',
 exintro: '', explaintext: '', exsentences: '1' , exlimit: 'max' , gsrsearch: 'Richard Feynman', format: 'json'},
  dataType: 'jsonp',

  success: function (x) {
  var result = x.query.pages;  
    for (var i in result) {
    var item = result[i].pageid;
  console.log(item);

    }
  }
});

当使用 for...in 循环遍历结果时,此代码有效。当编写相同的代码尝试访问如下所示的结果变量时,控制台打印 Uncaught TypeError: Cannot read property 'pageid' of undefined

 success: function (x) {
  var result = x.query.pages;  
    var item = result[0].pageid;
  console.log(item);

  }
});

知道为什么会这样吗?为什么无法通过 result[0]result[1]、...、result[n] 访问 JSON 对象的每个键?

结果对象的键是非常大的整数(不是 0、1、2)。 results 不是数组,是JS对象。因此索引不以 0 开头。

for (var i in result)

.. 遍历对象中的每个键,因此 result[i] 有效。请参阅 MDN 以供参考。

我想你可以像这样记录结果:

success: function (x) {
  var result = x.query.pages;  
      var item = result[0].pageid;
      console.log(result,result[0]);
  }
});

result[0] 如果是项目

,则不能有名为 foo 的键

在您的示例中,您尝试执行 result[0],它读取名为 result 的数组的第一个元素。由于 results 是一个对象,因此 result[0] 意味着您正在尝试访问 result.0 在这种情况下并不总是存在。

使用 result[0].pageid 您正在尝试访问 result.0.pageid,如果 result.0 不存在,则显然不会存在。因此,您将收到错误 "Uncaught TypeError: Cannot read property 'pageid' of undefined".

只需按照下面的代码中提到的方式放置一些控制台日志,您就会明白为什么会遇到此错误。

    $.ajax({
    url:'https://en.wikipedia.org/w/api.php',
    data: { action : 'query', generator: 'search', gsrnamespace : '0', gsrlimit : '10', prop : 'extracts', pilimit: 'max', exintro: '', explaintext: '', exsentences: '1' , exlimit: 'max' , gsrsearch: 'Richard Feynman', format: 'json'},
    dataType: 'jsonp',
    success: function (x) {
        var result = x.query.pages;
        console.log("== What is the type of result : " + typeof(result)); //Object
        console.log("Complete Result : " + JSON.stringify(result));
        for (var i in result) {
            console.log("Property type for object result :" + typeof(i)); //String
            var item = result[i].pageid;
            var title = result[i].title;
            var extract = result[i].extract;
        }
    }
 });

所以,您在这里尝试做的是通过索引访问非数字对象属性,这是不可能的。如果你想做,那么你可以了解更多here