我试图在JavaScript中理解一些东西。
让我们说我做了以下事情:
let x = [];
x['Monday'] = 'Work';
x['Tuesday'] = 'More Work';
console.log(x) //[Monday: "Work", Tuesday: "More Work"]
console.log(x.Monday) //"Work"
console.log(x.Tuesday) //"More Work"
有人可以帮助解释为什么数组现在表现得像一个对象?
因为数组是一个对象
[] instanceof Object
> true
[] instanceof Array
> true
两者都给你真实,因为Array扩展了普通的Object功能。此外,数组通过字符串值索引其所有成员
const array = [];
array[0] = 1;
array['0'] // will give you 1
这也是大多数人意想不到的。因此,即使您将数组用作带索引的普通数组,该数组的行为也类似于Object
JS中的所有内容都是一个对象,除了Primitive types(甚至包含Object包装器的那些)
这就是为什么你可以像访问任何其他对象一样访问array.length
array.indexOf()
等属性和方法。索引就像数组对象上的特殊属性iterable
所有JavaScript数组也是一个对象
如果你检查x的类型
typeof x
它会打印“对象”
var x =[];
x.name = "X";
这里我们正在创建x数组的属性“名称”
因为在javascript中没有真正的Array
类型作为低级类型。 Array
类只是一种从Object
类扩展而来的类。
Number
,String
等基元之外。从Object
课程延伸。通过这样做。
var ar = [] // I used array literal. Not totally same but similar of doing new Array();
arr['foo'] = 'bar';
您只是向对象添加新属性。
我想你现在已经听说过Array是一种Object,所以我不会再打败那匹死马了。好吧也许一点点。
这意味着您可以使用“星期一”和“星期二”等名称来判断和设置属性。因为它是一种Object,所以这没有问题(像a[‘1’]
这样的语句隐含地将该字符串'1'转换为数字1)。但是不要将此属性名称误认为是数组索引,那些是特定的整数**。那有什么重要性?
数组有一个很好的行为,当你使用实际的数组索引时,length
属性会自动为你更新。更不用说数组索引访问通常由JVM实现优化,明显快于常规属性访问。
另外,让我们不要忘记拥有Arrays的其他巨大好处之一,它们继承自Array.prototype,它有很多有用的方法:)!
因此,简而言之,使用阵列之类的阵列 - 获得性能提升,同时确保代码更易于理解。
来源:JS权威指南第6版 - 数组章节
(**非负且小于2 ^ 32-2,因为数组具有32位大小索引。)