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

Posted

技术标签:

【中文标题】什么是数组“属性列表”,它们与简单对象有何不同?【英文标题】:What are the Array "property lists" called and how are they different from simple objects? 【发布时间】:2019-01-09 15:24:57 【问题描述】:

我在 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 的属性列表。他们叫什么? (以便我可以进一步搜索。)这些是特定于 Node 的吗?

【问题讨论】:

数组是对象。不,这不是 Node 的事情。这是基本的 javascript 除了“原始值”之外,Javascript 中的所有其他内容都是一个对象...您可以像在代码中那样将属性添加到您喜欢的任何对象...var d = new Date; d.is_a='lie' 仅适用于同var d = new Object; d.is_a = 'lie' 哇,我是个白痴...谢谢@Pointy 和 Jaromanda X;已经有一段时间了,完全忘记了基础......应该删除这个问题还是留在这里供其他人教育? 【参考方案1】:

正如 Pointy 和 Jaromanda X 在问题 cmets 中指出的那样,在 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

【讨论】:

以上是关于什么是数组“属性列表”,它们与简单对象有何不同?的主要内容,如果未能解决你的问题,请参考以下文章

什么是微服务,它们与 API 驱动的架构有何不同?

什么是 switch 表达式,它们与 switch 语句有何不同?

如何用简单的英语解释回调?它们与从另一个函数调用一个函数有何不同?

rancher 与 Kubernetes 有何不同

PostgreSQL 与 MySQL 有何不同? [关闭]

字符串与 Pascal 中的大量(数组)字符有何不同?