【发布时间】: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