【发布时间】: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