数组“属性列表”的调用方式是什么,它们与简单对象有何不同?

时间:2018-08-01 23:51:55

标签: javascript arrays node.js object

我在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吗?

1 个答案:

答案 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