javascript - 为什么 JavaScript 允许数组语法访问属性?

标签 javascript arrays object

密切相关的问题:

我有以下代码示例:

var someVariable = {abc: "def", ghi: "jkl"}

someVariable["SomeProperty"] = "dfsdfadsd"

alert(someVariable["SomeProperty"])

var someOtherVariable = { abcd: "defsd", ghij: "dfsdfdss" }

someOtherVariable.SomeOtherProperty = "adfsdfsd"

alert(someOtherVariable.SomeOtherProperty);

alert(someOtherVariable["SomeOtherProperty"])

它们都按照它们看起来的样子做——它们将属性附加到各自的对象上。 alert显示每种情况下的预期字符串。我从相关问题中了解到,两者在功能上没有区别。

我在W3Schools的JavaScript arrays tutorial中也遇到了以下说法: :

Many programming languages support arrays with named indexes.

Arrays with named indexes are called associative arrays (or hashes).

JavaScript does not support arrays with named indexes.

In JavaScript, arrays always use numbered indexes.  

如果是这样的话,为什么这里允许使用数组语法? (同样,我对相关问题的理解是,关联数组和 JavaScript 对象之间的实际区别至少有点模糊,这就是 JavaScript “在幕后”实现对象属性的方式)。

据我所知(如果我错了,请纠正我,因为 JavaScript 不是我的主要语言),不可能用数组做其他你期望能够做的事情(例如迭代与 for 循环),那么为什么要同时使用这两种语法呢?在 C# 中,您可以执行以下操作:

// A C# dictionary is basically an associative array
Dictionary<string, int> dict = new Dictionary<string, int>();
// Fill dictionary ...
foreach (string key in dict.Keys) {
    int value = dict[key];
    // Do something with the value
}

但我不知道有什么方法可以用 JavaScript 属性做类似的事情。在 C# 中,这种语法显然是必要的(键绝对不是 dict 的属性),但为什么 JavaScript 具有这种语法(假设它们完全相同)?我是否遗漏了什么,或者这实际上完全是多余的?

最佳答案

Why does JavaScript allow array syntax to access properties?

这不是“数组语法”。

方括号是访问对象属性的标准方法。

数组只是一种对象。

在访问属性方面,方括号表示法比点表示法具有一些优势:

  • 您可以使用任何表达式来定义名称,包括变量和函数调用。
  • 您可以访问名称在标识符中无效的属性(例如以数字开头的属性,这就是您通常看到它们用于访问数组的原因)。

它也更加冗长并且可能效率较低。

the actual distinction between an associative array and a JavaScript object is, at a minimum, slightly blurry, and that that's how JavaScript is implementing object properties "under the hood"

JavaScript 没有称为“关联数组”的功能。 (W3Schools 不是一个值得信赖的来源)。

它有对象,这些对象(其核心)是属性:值对的集合。 (这类似于 PHP 的关联数组功能)。

它具有数组,这些数组是从 Array 构造函数继承的对象,获得诸如 forEach 之类的方法和诸如 length 之类的属性(它使用 getter 函数来确定其基于值的值)名称为最大整数值的属性)。

关于javascript - 为什么 JavaScript 允许数组语法访问属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42513889/

相关文章:

javascript - 我一直在尝试在 AngularJs 中实现分页

javascript - 如何用它的值替换字符串中的表达式?

javascript - 如何为 JavaScript 代码编写混淆器?

c# - 对象实例正在覆盖另一个实例,但我不明白为什么

ios - “__block变量”内存管理的规则是什么?

javascript - 如何在Javascript中异步使用对象?

java - 如何在不使用 Java 8 Stream 的情况下查找 Java 中两个 ArrayList<Integer> 之间的差异?

javascript - JS中的树状数据结构允许最快的节点查找?

JavaScript 搜索和循环 - 不返回正确的值

model-view-controller - 将 ActionScript 对象转换为模型