什么是数组“属性列表”,它们与简单对象有何不同?
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
【讨论】:
以上是关于什么是数组“属性列表”,它们与简单对象有何不同?的主要内容,如果未能解决你的问题,请参考以下文章
什么是 switch 表达式,它们与 switch 语句有何不同?