我有这个JSON代码:
{
"query": {
"pages": {
"-1": {
"ns": 0,
"title": "StackOverflow",
}
}
}
}
我将其解析为JSON对象:
data = JSON.parse(jsonString);
为什么要访问对象-1
我必须data.query.pages[-1]
而不是data.query.pages.-1。在此示例中,pages
不是数组而是对象。
答案 0 :(得分:8)
它不是一个数组,它是一个对象。 object["name"]
和object.name
都是访问给定对象上名为name
的属性的相同方式。
您无法使用object.-1
访问对象属性,只是因为语法错误,与您使用object.+1
或object.[1
或{{的方式相同1}}。它们是对象属性的所有有效名称,但在使用object./1
语法时它们在语法上无效。
另一个警告是你不能拥有整数的属性名称。设置或获取object.propertyName
与object[-1]
相同,因为属性名称将转换为字符串。如果它是有效的语法,将与访问object["-1"]
相同。
答案 1 :(得分:2)
您无法data.query.pages.-1
执行var -1;
,原因与您无法-1
相同:foo.bar // Access member bar of object foo
不是有效的标识符。
但这不是问题。
foo["bar"] // Access member bar of object foo
只是
的快捷方式data.query.pages["-1"]
所以你可以做到
data["query"]["pages"]["-1"]
你甚至可以做到
{{1}}
答案 2 :(得分:1)
括号表示法与数组无关,它只是访问属性的另一种方式。实际上,我们只能对数组使用括号表示法的原因在于评估规则:要使用点表示法,属性名称必须是有效的identifier name。
或者简单地说:
如果属性名称是有效变量名称或保留字,则只能使用点表示法。
并且-1
并不属于该类别(例如,你不能var -1 = 'foo';
)。
无效标识符名称的示例:
0foo
,-foo
,&bar
任何不以字母开头的内容_
或$
foo-bar
,foo+bar
,foo bar
任何包含非字母,数字,_
或$
的内容(或属于特定的unicode范围,请参阅规范)。
但是,使用保留字是可能的,即使它们不能用作变量:
foo.if // valid
var if = 42; // invalid