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。
我正在与维基百科媒体一起做一个项目 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。