我在Node上玩耍,不小心将大括号({}
)键入错误,并改用方括号([]
),然后开始将变量用作简单对象。没有引发任何错误,并且行为似乎是相同的,但是当我使用Object.getPrototypeOf()
检查类型时,它们是不同的。
> var cake = [];
> cake["is_a"] = "lie";
> cake
[ is_a: 'lie' ]
> Object.getPrototypeOf(cake.is_a)
[String: '']
> Object.getPrototypeOf(cake)
[]
> Object.getPrototypeOf({})
{}
然后我认为这是数组顶部的语法糖,但没有:
> cake[0]
undefined
这让我想起了Elixir的关键字列表或Erlang的属性列表。他们叫什么? (以便我进一步搜索Google。)这些特定于Node吗?
答案 0 :(得分:0)
正如Pointy和Jaromanda X在问题注释中指出的那样,在JavaScript中,除primitives之外,所有事物都是一个对象(包括数组):
最新的ECMAScript标准定义了七种数据类型:
是基元的六种数据类型:
Boolean
Null
Undefined
Number
String
Symbol
(ECMAScript 2015中的新功能)和
Object
(另请参阅相关问题Primitive value vs Reference value)。
我的问题的代码示例在欺骗(至少对我而言),因为看起来好像某些东西已存储在数组本身中,但这仅是Node REPL的表示(在Chrome的控制台上也是如此)而数组实际上是空的:
> var cake = [];
> cake["is_a"] = "lie";
> cake
[is_a: "lie"]
> cake.length
0