首页 > 解决方案 > 什么样的 JS 对象是 [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 检查器控制台)

请注意,我不需要使用 初始化的答案{}。那不是问题的重点。

标签: javascriptnode.js

解决方案


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 类型的对象。实际上定义数组与定义几乎相同,let a = { 0: 'one', 1: 'two' }除了 Array(作为一种类型)在 javascript 中被识别为“特殊”类型,它具有特殊的初始化语法 ( let a = [ 'one', 'two', 'three' ],应用从零开始的编号键并且它是可迭代的(可以使用在for...of循环中)。当然+所有原型方法,例如findfilter等。考虑到这一点,将字符串键控属性添加到数组是绝对有效的(不推荐)javascript,只是因为console.log在输出你得到的数组时应用了特殊格式[ foo: 'one', bar: 'two' ](带方括号)。

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


推荐阅读