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

Javascript 为什么这个json示例将对象解析为数组,javascript,arrays,json,object,Javascript,Arrays,Json,Object,我有以下JSON代码: { "query": { "pages": { "-1": { "ns": 0, "title": "StackOverflow", } } } } 我将其解析为一个JSON对象: data = JSON.parse(jsonString); 为什么要访问对象-1我必须执行数据.query.pages[-1]而

我有以下JSON代码:

{
    "query": {
        "pages": {
            "-1": {
                "ns": 0,
                "title": "StackOverflow",
            }
        }
    }
}
我将其解析为一个JSON对象:

data = JSON.parse(jsonString);

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

它不是数组,而是对象。
object[“name”]
object.name
都是访问给定对象上名为
name
的属性的相同方法

您不能使用
对象-1
访问对象属性,因为这是一个语法错误,与您不能使用
对象+1
对象的方式相同。[1
对象。/1
它们都是对象属性的有效名称,但在使用
对象.propertyName
语法时,它们在语法上无效


另一个警告是,属性名不能是整数。设置或获取
对象[-1]
对象[“-1”相同
将属性名称转换为字符串。如果语法有效,则与访问
对象相同。

您不能执行
数据.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
不属于这一类(例如,你不能做
var-1='foo';


无效标识符名称的示例:

  • 0foo
    -foo
    和bar

    任何不以字母开头的内容,
    \uuu
    $

  • foo-bar
    foo+bar
    foo-bar

    任何包含非字母、数字、
    \uu
    $
    的内容(或属于特定unicode范围,请参见规范)

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

foo.if // valid
var if = 42; // invalid
,虽然我想它没有提到任何数字