为什么这个json示例对象被解析为数组

时间:2014-07-18 20:12:06

标签: javascript arrays json object

我有这个JSON代码:

{
    "query": {
        "pages": {
            "-1": {
                "ns": 0,
                "title": "StackOverflow",
            }
        }
    }
}

我将其解析为JSON对象:

data = JSON.parse(jsonString);

为什么要访问对象-1我必须data.query.pages[-1]而不是data.query.pages.-1。在此示例中,pages不是数组而是对象。

3 个答案:

答案 0 :(得分:8)

它不是一个数组,它是一个对象。 object["name"]object.name都是访问给定对象上名为name的属性的相同方式。

您无法使用object.-1访问对象属性,只是因为语法错误,与您使用object.+1object.[1或{{的方式相同1}}。它们是对象属性的所有有效名称,但在使用object./1语法时它们在语法上无效。

另一个警告是你不能拥有整数的属性名称。设置或获取object.propertyNameobject[-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-barfoo+barfoo bar
    任何包含非字母,数字,_$的内容(或属于特定的unicode范围,请参阅规范)。

但是,使用保留字是可能的,即使它们不能用作变量:

foo.if // valid
var if = 42; // invalid