【问题标题】:arrays containing string indexes包含字符串索引的数组
【发布时间】:2021-08-06 18:12:40
【问题描述】:

在python中,一个列表,即使它是一个类,也禁止它的实例创建更多的用户属性。

>> x = list()
>> x.new_attribute = 90
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'new_attribute'

即使类可能通过__dict__ 接受更多属性,这正如预期的那样会引发错误。这是有道理的。

尽管不完全相似,但我的问题是 javascript 数组在被赋予属性时会表现得很奇怪。

let x = [1,2,3]
x.foo = "this is unexcpected"
console.log(x)

这将打印[1, 2, 3, foo: "this is unexcpected"]。这是我的问题,数组不应该让所有的键都是自动生成的数字吗?我的意思是,如果我检查长度,它仍然是 3,并且它不将 foo 算作通常意义上的数组的一部分,而且像 pop 这样的所有方法都不适用于 key-value 对。这很有意义,但是如果允许这样做(添加键值对)以便它们可以用于存储有关数组的元数据,那么这会让我感到更加困惑,毕竟长度也是一种属性。还有一个问题,如果数组可以存储键值对,除了插入、弹出...等一些方法之外,它们与对象有什么不同?

【问题讨论】:

  • 没有。数组是对象,因此它们可以具有对象具有的任何属性名称。由于 Array.prototype 对象及其方法,它们是一种特殊的对象。另请注意,JSON.stringify() 之类的东西将它们理解为“特殊”,这将忽略非数字属性名称。

标签: javascript python arrays list


【解决方案1】:

我知道这个帖子很旧,但我觉得这个问题很有趣......

问题的主要部分是对象和数组之间的区别。如 cmets 中所述,Array.prototype 是一个对象。这允许我们做一些奇怪的事情。以这段代码为例:

let y = [0,1,2,3];
y.foo = "Testing";
console.log(y);
y.sample = function(){
    console.log("Hello world");
}

y.sample()

是的,您可以向数组添加方法,在控制台上它会输出以下内容:

> (4) [0, 1, 2, 3, foo: 'Testing']
    0: 0
    1: 1
    2: 2
    3: 3
    foo: "Testing"
    sample: ƒ ()
    length: 4
    [[Prototype]]: Array(0)

> Hello World

考虑到 Javascript 的制作方式,我们可以做一些奇怪的事情,比如向数组添加方法并将它们视为对象。但是,这些对象具有开发人员提供的预期用途和内置方法(推送、弹出等)。也许您可以通过修改 Array.prototype 对象在 JS 中创建自己修改后的数据类型。除此之外,将方法和属性添加到数组中感觉有点奇怪……那时只是为了可读性而创建一个对象,但是,嘿,只要您的代码可以理解并且有效,这对我有好处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 2022-09-22
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    相关资源
    最近更新 更多