Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
包含非数字键的JavaScript数组的正确术语是什么?_Javascript_Arrays_Associative Array_Terminology - Fatal编程技术网

包含非数字键的JavaScript数组的正确术语是什么?

包含非数字键的JavaScript数组的正确术语是什么?,javascript,arrays,associative-array,terminology,Javascript,Arrays,Associative Array,Terminology,我在寻找一个答案,而不是“坏习惯” 拜托,这只是一个关于术语的问题!这不是一个关于其他方法的问题,为什么使用对象或贴图而不是数组更好,为什么数组的长度属性和键数不同,等等 术语“关联数组”似乎通常用于用大括号声明的对象,但随后用方括号访问,如下所示: const a = {'not-a-proper-identifier': 'foo'}; a['not-a-proper-identifier'] // returns 'foo' 但你可以这样做: const a = [1, 2, 3]; a

我在寻找一个答案,而不是“坏习惯”

拜托,这只是一个关于术语的问题!这不是一个关于其他方法的问题,为什么使用对象或贴图而不是数组更好,为什么数组的长度属性和键数不同,等等

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

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变体就是项目的一个分支

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

它只是“对象”
obj['foo']
相当于
obj.foo


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

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

检查您提供的示例:

const a=[1,2,3];
a
是数组,但数组是javascript中的对象

a['foo']='bar';
可以设置对象的属性

a['foo'];
这确实是
;我们只是在访问对象上的属性

console.log(a);//输出(至少来自Chrome)为[1,2,3,foo:“bar”]
Chrome似乎在解释如何将其记录到控制台方面做了令人钦佩的工作,它也可以将其作为标准对象记录下来

Array.isArray(a);//这仍然是事实
这是真的<代码>数组.isArray

a.length;//3.
长度按最大数字键+1计算

JSON.stringify(a);//仅返回[1,2,3],“foo”消失。
事实上,JSON无法处理这种键的混合(您可能知道,考虑到您正在处理一个扩展JSON的项目),因此它必须决定是将对象解析为JSON对象还是JSON数组

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

至于你的实际问题。。。我找不到这些对象属性的名称。我认为我能想象的最好的描述是:


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


这并不是特别好,但似乎你的问题的实际答案只是不,没有一个名称。

我不认为有一个通用的定义,因为这样的事情几乎从未做过(因为这是一个坏主意),“关联数组”是PHP编程中的一个术语,在JavaScript中,这些被称为非数字键的objectsArray?我会重复上次你发布这个问题时说的话-我会称之为“误用数组”,但我不认为有任何通用术语。只不过是一个物体附带了一盒额外的糖果
(isArray、.map、.reduce等)
。可以将非数字键与数组一起使用,因为实际上它是一个对象,但它不是数组的用途。OP特别要求数组,数组是对象,但它们的描述和处理方式明显不同,因此表示“它是一个对象”不是很有用。将数组视为以键作为数组索引的对象,例如
['foo','bar']
~
{0:'foo',1:'bar'}
@andymcculough,但这仍然不能回答OP的问题。包含非整数键的数组通常不被称为“对象”,如果有人这样称呼它,那就有误导性。例如,您不能迭代一个对象(如中的,本机),但可以迭代一个数组。@andymcculough也不是用于此目的的术语。这是一个错误的术语,来自PHP,任何听到(或读到)“关联数组”并知道JS会将其识别为“对象”。@mbojko您仍然发布了一个答案,但没有回答这个问题。“不符合标准javascript命名语法的对象属性”并不是很简洁,但我想,如果能够将非数字键填充到数组中(以及负数和非整数数字键)与其说是一种设计,不如说是一种意外,那么这个概念就不需要简洁的术语了。@kshetline确实如此-尽管我不能完全肯定这是一种意外,只是javascript设计的一个怪癖。我认为它没有命名的原因是它基本上是一个如何解释js的问题。一个键可以是任何字符串,这很公平,但是你能在
后面有一个y字符串,并且在引号之外吗?不,不是真的,因为这是怎么解释的?如果我有
x={'a-b':2}
,我显然不能以
x.a-b
的身份访问它,因为口译员不知道这是
x['a-b']还是
x.a`减去
b
我感谢你抽出时间礼貌地讨论这个问题。对于在数组中使用非数字键的想法,似乎很多人都无法合理地表达他们的反对意见(我敢肯定)