未捕获的TypeError:无法读取未定义的属性'foo'

时间:2016-05-31 10:21:41

标签: javascript jquery json wikipedia-api

我正在使用维基百科媒体API进行项目。我正在使用Jquery查询API。检查Chrome中的开发者控制台时,以下请求有效,如此代码集http://codepen.io/jowze/pen/NNZNKY/?editors=1010

中所示
$.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对象的每个键?

4 个答案:

答案 0 :(得分:0)

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

for (var i in result)

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

答案 1 :(得分:0)

我认为你可以记录这样的结果:

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

结果[0] 如果它是一个项目

,则必须有一个名为 foo 的密钥

答案 2 :(得分:0)

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

使用result[0].pageid,您尝试访问result.0.pageid,如果result.0不存在,这显然不会存在。因此,您将收到错误" Uncaught TypeError:无法读取属性&page;'未定义"。

答案 3 :(得分:0)

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

    $.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