【问题标题】:Associative arrays in javascript is a bug?javascript中的关联数组是一个错误?
【发布时间】:2019-06-13 19:44:47
【问题描述】:


我们知道 JavaScript 不支持具有命名索引的数组。 (关联数组)
但是当我们在 javascript 中声明一个关联数组时,它不会抛出错误,而且效果惊人。

let arr = [];
arr.name = 'John';
arr.lastName = 'Doe';
arr.age = 46;

let obj = {name: 'John', lastName: 'Doe', age: 46};


console.log('arr')时,会显示:

[name: "John", lastName: "Doe", age: 46] //Shown with a special array sign
   age: 46
   lastName: "Doe"
   name: "John"
   length: 0
   __proto__: Array(0) //Shown Array Not Object


与:

console.log(arr instanceof Array);  //true
console.log(arr instanceof Object); //true

console.log(obj instanceof Array);  //false
console.log(obj instanceof Object); //true


如您所见,Javascript 显示一个带有数组特定符号的关联数组。 [](括号)
但它会将其视为具有该数组的对象,因为某些数组方法和属性(如length)会产生不正确的结果。
另外,如果 JavaScript 使用这种类型的数组作为对象,为什么不使用对象的特殊标记呢? {}(大括号)
简而言之,这是 JavaScript 解释器的 bug 还是某种能力?

【问题讨论】:

  • Javascript 没有关联数组,设置数组对象的属性不是“使用”数组部分。
  • 不是错误...。您正在使用数组来创建“类似对象的数组”typeof [] 将返回 'object' 也因为没有 'array' 类型
  • 来自标准:“一个数组对象是一个奇特的对象,它对数组索引属性键进行特殊处理......
  • @MR.Mostafa 当然会。如果它是填充数组或空数组,则完全不相关。控制台如何处理输出也无关紧要,会因环境而异
  • 您只是向对象添加属性(参见数组的原型) - 这是预期的结果。

标签: javascript arrays associative-array


【解决方案1】:

在 Javascript 中,数组不仅被“视为”一个对象——它还是一个对象。正如你已经看到的,因为arr instanceof Object 是真的。

因此,与所有对象一样,您可以将属性分配给数组。

length是数组的一个特殊属性,表示数组元素的个数。由于在您的示例中,arr 没有元素,因此其 length 属性正确地为 0。对象不会自动具有特殊的 length 属性。

【讨论】:

    【解决方案2】:

    数组是一个对象——它带来了你可以使用的自己的方法。 该对象不是数组 - 您不能使用数组对象的方法。

    我发现这段文字用几个词来描述它:http://www.javascripter.net/faq/arrayobject.htm

    【讨论】:

      猜你喜欢
      • 2012-12-11
      • 2014-10-07
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多