[英]What kind of JS object is [ foo: 'bar']
如果我创建一个空白数组并分配一个值:
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检查器控制台)
请注意,我不需要用{}
初始化的答案。 那不是问题的重点。
javascript中的所有内容都是对象,数组也是。 Array基本上是一个从零开始的键对象,它是可迭代的,因此,在将带有字符串键的值添加到Array时,您只是在向该对象添加键。
实际上,您可以创建自己的可迭代对象,就像Array一样,并将其与for...of
循环一起使用。 检查一下: https : //jsfiddle.net/gumh6bsy/
如果运行let a = [foo:'two',bar:'one'],则会出现错误。 那么我的代码中的循环如何获取该结果并将其打印到控制台。 循环创建后,它似乎可以很好地管理。 我以为起初它只是将其转换为对象,但它是一个Array实例。 –网络袋熊
let a = [ foo: 'two', bar: 'one' ]
引发错误,因为方括号是用于初始化数组的语法,因此被JavaScript引擎验证,并且不允许在初始化中定义键。 同时,键分配语法( a['foo'] = 'two'
)对于数组和对象都没有任何不同。 实际上,这只是将属性分配给对象的语法。 这里的主要结论是,在javascript array中,是Array类型的对象 。 实际定义数组与定义let a = { 0: 'one', 1: 'two' }
几乎相同,不同之处在于Array(作为一种类型)在具有特殊初始化语法的javascript中被识别为“特殊”类型( let a = [ 'one', 'two', 'three' ]
获得基于零的数字键,并且它是可迭代的(可以用于循环的for...of
)+所有原型方法,例如find
, filter
等。记住这一点,将字符串键控属性添加到数组是绝对有效的(不建议使用)javascript,并且仅仅因为console.log
在输出数组时会应用特殊格式,所以您会得到[ foo: 'one', bar: 'two' ]
(带方括号)。
您甚至可以自己编写一些非常粗糙的数组实现,例如: https : //jsfiddle.net/t96ehm1r/ (当然,没有用于快速初始化的语法糖和所有原型方法,等等)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.