什么样的JS对象是[foo:'bar']

时间:2018-10-27 18:49:07

标签: javascript node.js

如果我创建一个空白数组并分配一个值:

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检查器控制台)

请注意,我不需要回答说{}进行初始化。那不是问题的重点。

1 个答案:

答案 0 :(得分:1)

javascript中的所有对象都是对象,数组也是。数组基本上是一个从零开始的,可迭代的键对象,因此,在将带有字符串键的值添加到Array时,您只是在向该对象添加键。

实际上,您可以创建自己的对象,该对象可以像Array一样进行迭代,并与for...of循环一起使用。检查一下:https://jsfiddle.net/gumh6bsy/

  

如果运行let a = [foo:'two',bar:'one'],则会出现错误。那么我的代码中的循环如何获取该结果并将其打印到控制台。循环创建后,它似乎可以很好地管理。我以为起初它只是将其转换为对象,但它是一个Array实例。 – Cyber​​wombat

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循环中使用)当然+所有原型方法,例如findfilter等。数组是绝对有效(不建议使用)的javascript,只是因为console.log在输出数组时会应用特殊格式,所以您得到[ foo: 'one', bar: 'two' ](带方括号)。

您甚至可以自己编写一些非常粗糙的数组实现,例如:https://jsfiddle.net/t96ehm1r/(当然,没有任何语法糖可用于快速初始化和所有原型方法,等等)