Javascript 为什么这在JS中是无效的

Javascript 为什么这在JS中是无效的,javascript,Javascript,为什么这是有效的是JS: const a = ['b', 'c']; a.d = 'e'; a.x = { y: 'z' }; console.log(a); // ['b', 'c', d: 'e', x: { y: 'z' }] 但这不是: const a = ['b', 'c', d: 'e', x: { y: 'z' }]; console.log(a); 我们如何一步构建这样一个数组?您正在混合数组和对象文本 ['a', 'b'] 是数组文字,创建一个包含两个字符串的长度为2的数

为什么这是有效的是JS:

const a = ['b', 'c'];
a.d = 'e';
a.x = { y: 'z' };
console.log(a); // ['b', 'c', d: 'e', x: { y: 'z' }]
但这不是:

const a = ['b', 'c', d: 'e', x: { y: 'z' }];
console.log(a);

我们如何一步构建这样一个数组?

您正在混合数组和对象文本

['a', 'b']
是数组文字,创建一个包含两个字符串的长度为2的数组

{a: 1, b: 2}
是一个对象文字,用于在两个关键点处创建具有两个值的对象


第一个示例将键下的传统值添加到数组中。这是可能的,因为每个数组也是一个对象。这(afaik)不能通过文本来完成。

JavaScript
数组实际上是一个“类”,因此数组的实例实际上是一个对象。这也是[1,2,3]
类型所说的

可以对JavaScript对象执行一些常规操作,如添加属性或覆盖现有属性,例如,使用所需的任何内容覆盖长度,或在其上添加自定义方法

var-arr=[1,2,3,4];
arr.length=100;
arr.thirditem=函数(){
归还此[3];
}.bind(arr);
控制台日志(arr.length);

console.log(arr.thirditem())数组元素不是数组属性。通过在方括号中列出零个或多个元素来声明数组,并使用点表示法声明其属性。
这不能像你要求的那样“一步到位”,因为它们本质上是不同的东西。

你可以将一个对象作为容器,将所有数组值与索引相加。为了迭代数组值,可以使用

const a={0:'b',1:'c',d:'e',x:{y:'z'};
控制台日志(a);
console.log(Object.assign([],a));//取数组值

.as控制台包装{max height:100%!important;top:0;}
您的建议是JavaScript可以允许以下语法--

这等于

var arr = [];

arr.some = "someVal";
arr.other = "otherVal";
这样一个阵列是否会有大量的实际用例

一种语言并没有无限的特性集,有些特性最终会被“抛弃”。相反,这些特性被添加到语言中

向该语言添加功能不是免费的。它们必须经过设计、实施和测试


显然,添加这种语法并不值得

这不是一个数组。在第一段代码中,您使用数组作为映射,这是没有用的。您打算如何使用此结构?如果您想在Javascript中使用字母数字索引,并使用语法
d:'e'
,则必须使用对象,而不是具有数字索引的数组。您确定第一个索引有效吗?OP:您的前提是错误的,
console.log(a)
不会输出您所声称的功能。我假设这就是您要得到的
常量a=['b','c',{d'e'},{x:{y:'z'}]?确切地说,数组本质上是对象,因此它是有效的。“这不能(afaik)通过文字来完成”,这就是我试图理解的,为什么?因为文字是分开的,数组文字只能初始化数组内容,而不能初始化任何额外的键/值对。如果你问我为什么它是这样设计的:我不是W3C的一部分,也不知道。我不是建议添加这种结构,在控制台中编写第一个代码段是可行的,而另一个不可行,我试图找出原因,以便更好地学习语言,是的,我同意这种结构没有用处,但是它已经被允许了,所以我们使用建议的语法构建了一个数组(设计上没有其他方法),然后它被实现为一个对象,只有这样我们才能操作它的属性,这允许第一个代码片段工作。我跟对了吗?是的,没错。您需要遵循语法规则,但在此之后,JavaScript允许您以多种方式操作任何对象(甚至函数也可以有属性,因为它们在技术上也是对象)
var arr = [];

arr.some = "someVal";
arr.other = "otherVal";