包含非数字键的 JavaScript 数组的正确术语是啥? [关闭]

Posted

技术标签:

【中文标题】包含非数字键的 JavaScript 数组的正确术语是啥? [关闭]【英文标题】:What is the proper terminology for a JavaScript array that includes non-numeric keys? [closed]包含非数字键的 JavaScript 数组的正确术语是什么? [关闭] 【发布时间】:2019-12-08 20:54:57 【问题描述】:

我正在寻找“不良做法”以外的答案。

拜托,这只是一个关于术语的问题!这不是关于可以完成的替代方法的问题,为什么最好使用对象或 Map 而不是数组,为什么数组的长度属性和键的数量不同等等。

术语“关联数组”似乎通常用于用花括号声明的对象,但随后用方括号访问,如下所示:

const a = 'not-a-proper-identifier': 'foo';
a['not-a-proper-identifier'] // returns 'foo'

但你可以这样做:

const a = [1, 2, 3];
a['foo'] = 'bar';
a['foo']; // Yep, 'bar' comes back.
console.log(a); // Output (at least from Chrome) is [1, 2, 3, foo: "bar"]
Array.isArray(a); // This is still true
a.length; // 3
Object.keys(a).length; // 4
JSON.stringify(a); // Only returns [1,2,3], 'foo' disappears.
[1, 2, 3, foo: "bar"] // Syntax error! The console representation isn't proper javascript.

那么,如果你要用数组来做这个,有什么特别的东西可以调用这种数组吗?

我为什么要问?

不是因为我特别想自己使用这个数据结构,而是因为我希望能够支持序列化和反序列化这样一个数组,如果遇到我正在处理的 JSON 的变体,@ 987654321@,JSON5 项目的一个分支。

如果我要支持它,最好知道在引用这样的数组时使用什么术语。

【问题讨论】:

我不认为有一个共同的定义,因为这样的事情几乎从来没有做过(因为这是一个坏主意) “关联数组”是 php 编程中的一个术语,在 JavaScript 中,这些只是称为对象 带有非数字键的数组? 我将重复您上次发布此问题时所说的话 - 我将其称为“滥用数组”,但我认为没有任何通用术语。 Array 只不过是一个带有额外一盒糖果的对象(isArray, .map, .reduce, etc)。您可以使用数组的非数字键,因为它实际上是一个对象,但它不是数组的用途。 【参考方案1】:

让我们认为将非数字键添加到数组不是一个好主意; cmets 显然同意这一点,从您提供的代码示例中可以明显看出这一点。从表面上看,该语言很难始终如一地处理这个问题。

您编写的代码的解释可能没有必要,但我觉得最好尽可能清楚地说明为什么 javascript 中存在一些表面上的不一致,以便更好地理解该语言的工作原理。

检查您提供的示例:

const a = [1, 2, 3];

a 是一个数组,但数组是 javascript 中的对象。

a['foo'] = 'bar';

您可以设置对象的属性。

a['foo'];

这确实是bar;我们只是在访问一个对象的属性

console.log(a); // Output (at least from Chrome) is [1, 2, 3, foo: "bar"]

Chrome 似乎在解释如何将其记录到控制台方面做得非常出色,它也可以将其作为标准对象记录下来。

Array.isArray(a); // This is still true

这是真的; Array.isArraychecks the Class internal property in order to determine what is an array。 This answer indicates that this can't be changed.

a.length; // 3

长度计算为最大数字键 + 1

JSON.stringify(a); // Only returns [1,2,3], 'foo' disappears.

确实 - JSON 无法处理这种混合键(您可能知道,考虑到您正在开发一个扩展 JSON 的项目),因此它必须决定是将对象解析为 json 对象还是 json数组。

控制台表示实际上只是尽可能好地表示正在记录的数据,并且考虑到 javascript 对象的混合性质 - 用于数组和字典,实际上,很难获得数据的完美表示.

至于您的实际问题...我无法找到这些对象属性的名称。我想说我能想到的最好的描述是:

不符合标准 javascript 命名的对象属性 语法

这不是特别好,但您的问题的实际答案似乎只是不,这些没有名称。

【讨论】:

“不符合标准 javascript 命名语法的对象属性”并不十分简洁,但我想如果能够将非数字键填充到数组中(以及负数和非整数数字键)更像是一个意外而不是设计,这个概念不需要简洁的术语。 @kshetline 确实 - 虽然我不完全确定这是一个意外,只是 javascript 设计的一个怪癖。我认为它没有被命名的原因是它基本上是 js 如何解释的问题。键可以是任何字符串,这很公平,但是您可以在 . 之后和引号之外使用 _an_y 字符串吗?不,不是真的,因为这将如何解释?如果我有x = 'a -b': 2 ,我显然不能以x.a-b 访问它,因为解释器不知道x['a-b'] or x.a` 是否减去b 感谢您抽出宝贵时间礼貌地讨论这个问题。似乎很多人无法将他们对在数组上使用非数字键的想法(我当然不赞成将其作为一种现实做法!)的合理反对与只是想知道是否存在的人区分开来一种简洁的方式来引用这个概念。 然而,有些人并不急于投反对票或发表尖刻的评论。【参考方案2】:

这只是“对象”。 obj['foo'] 等同于 obj.foo

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object

【讨论】:

OP 专门要求一个 array,Arrays are 对象,但肯定经常以不同的方式描述和处理,因此说“它是一个对象”不是很有用。 将数组视为以数组索引为键的对象,例如['foo', 'bar'] ~ 0: 'foo', 1: 'bar' @andymccullough 但这仍然没有回答 OP 的问题。包含非整数键的数组通常不称为“对象”,如果有人 确实 这么称呼它,那将是误导。例如,你不能迭代一个对象(如原生),但你可以迭代一个数组。 @andymccullough 这也不是用于此的术语。这是来自 PHP 和任何听到(或读取)“关联数组”并知道 JS 会将其识别为“对象”的人的错误术语。 @mbojko 你仍然发布了一个没有回答问题的答案。

以上是关于包含非数字键的 JavaScript 数组的正确术语是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

包含带有数字键的数组失败

如何计算数组中对象键的总和 - javascript

在Javascript中更新对象数组中的键的最有效方法是啥? [复制]

如何从每个钢琴键的一个数组中构建正确的和弦?

Javascript 无法正确排序包含两个数组值的数组

Javascript:编写一个接收数字的函数,并多次返回一个包含该数字的数组