如果我创建一个空白数组并分配一个值:
let a = []
a['foo'] = 'bar'
console.log(a) // [ foo: 'bar'] - not in SO console though
console.log(a[0]) // undefined
console.log(a.length) // 0
console.log(a instanceof Array) // true
for (let i of a) {} // Doesn't loop but doesn't throw errors like {}
for (let o in a) {
console.log(o) // foo
}
这是什么?长度为0的数组?这是什么样的JS东西?还会打印到节点控制台,但SO片段控制台无法识别(运行它并同时查看Web检查器控制台)
请注意,我不需要回答说{}
进行初始化。那不是问题的重点。
答案 0 :(得分:1)
javascript中的所有对象都是对象,数组也是。数组基本上是一个从零开始的,可迭代的键对象,因此,在将带有字符串键的值添加到Array时,您只是在向该对象添加键。
实际上,您可以创建自己的对象,该对象可以像Array一样进行迭代,并与for...of
循环一起使用。检查一下:https://jsfiddle.net/gumh6bsy/
如果运行let a = [foo:'two',bar:'one'],则会出现错误。那么我的代码中的循环如何获取该结果并将其打印到控制台。循环创建后,它似乎可以很好地管理。我以为起初它只是将其转换为对象,但它是一个Array实例。 – Cyberwombat
let a = [ foo: 'two', bar: 'one' ]
会引发错误,因为方括号是用于初始化数组的语法,因此会被JavaScript引擎验证,并且不允许在初始化中定义键。同时,数组和对象的键分配语法(a['foo'] = 'two'
)都没有任何不同。实际上,这只是将属性分配给对象的语法。这里的主要要点是,在javascript中, array是Array类型的对象。实际定义数组与定义let a = { 0: 'one', 1: 'two' }
几乎相同,除了在具有特殊初始化语法的JavaScript(let a = [ 'one', 'two', 'three' ]
中,将数组(作为一种类型)识别为“特殊”类型(从零开始编号)应用了密钥,并且它是可迭代的(可以在for...of
循环中使用)当然+所有原型方法,例如find
,filter
等。数组是绝对有效(不建议使用)的javascript,只是因为console.log
在输出数组时会应用特殊格式,所以您得到[ foo: 'one', bar: 'two' ]
(带方括号)。
您甚至可以自己编写一些非常粗糙的数组实现,例如:https://jsfiddle.net/t96ehm1r/(当然,没有任何语法糖可用于快速初始化和所有原型方法,等等)