在JavaScript中,对象如何;obj";这并不意味着';不要将财产命名为;"富",;是否能够使用obj[“foo”给出一个值?

在JavaScript中,对象如何;obj";这并不意味着';不要将财产命名为;"富",;是否能够使用obj[“foo”给出一个值?,javascript,Javascript,我在《JavaScript忍者的秘密》一书中读到,如果浏览器支持,我们可以使用document.all[“id”]来获取文档中所有具有该id的元素。(虽然我们应该只有一个元素具有特定的ID) 但是document.all返回一个htmlCollection对象,我在Chrome中看到它有9个元素,就像数组一样(9个元素,在JSFIDLE中设置)。所以我可以理解为什么document.all[9]可以返回元素,但是为什么document.all[“foo”]也可以返回元素?如果我们定义var ob

我在《JavaScript忍者的秘密》一书中读到,如果浏览器支持,我们可以使用
document.all[“id”]
来获取文档中所有具有该id的元素。(虽然我们应该只有一个元素具有特定的ID)

但是
document.all
返回一个
htmlCollection
对象,我在Chrome中看到它有9个元素,就像数组一样(9个元素,在JSFIDLE中设置)。所以我可以理解为什么
document.all[9]
可以返回元素,但是为什么
document.all[“foo”]
也可以返回元素?如果我们定义
var obj={foo:123}
,那么我们可以说
obj[“foo”]
,但是
文档。所有的
都不是一个带有键
foo
的对象。所以据推测,
document.all[“foo”]
不应该返回这样的元素

注意:此问题不是询问有关
文档的使用。所有
,也不是询问页面上有两个ID相同的元素。它询问为什么一个似乎没有键的对象
obj
能够使用
obj[“foo”]
给出一个值。我不知道为什么这不是一个有效的编程问题。

示例代码:

1个具有此ID的元素:

具有该ID的2个元素:


更新:Dan Tao是正确的。这是因为有些属性是可枚举的,有些是不可枚举的,如果支持ECMAScript 5,我们可以很容易地产生相同的情况:这是一个关于JavaScript的有效问题,真正的答案是,这是由于属性的可枚举属性。

仅仅因为不应该有多个具有相同ID的元素,并不意味着不能查询它们。CSS选择器将应用于具有相同ID的多个元素,正如
querySelectorAll

document.querySelectorAll('#foo');
还可以返回多个元素


这里有一把小提琴来证明这一点:

仅仅因为您不应该有多个具有相同ID的元素,并不意味着您不能查询它们。CSS选择器将应用于具有相同ID的多个元素,正如
querySelectorAll

document.querySelectorAll('#foo');
还可以返回多个元素


这里有一些证据可以证明这一点:

DOM不是用Javascript实现的,Javascript的大多数规则都不适用于它


例如,在Chrome中
!!即使在Javascript规则中,所有对象都是真实的,所有
的计算结果都是
false

DOM不是用Javascript实现的,大多数Javascript规则都不适用于它


例如,在Chrome中
!!即使在Javascript规则中,所有对象都是真实的,所有
的计算结果都是
false

我想我理解你为什么困惑。让我解释几件事来澄清任何困惑。有些你可能已经知道了,但为了安全起见,我将涵盖所有内容

首先,类似数组的对象仍然可以像其他对象一样具有属性。即使是一个普通的
数组
也是这样

var arr = [1, 2, 3];
arr.foo = "bar";
arr["foo"]; // => "bar"
因此,在解析DOM之后,浏览器使用与页面上每个ID对应的属性填充
document.all
,尽管
HTMLAllCollection
非常类似于数组,这似乎是完全合理的

其次,对象的属性不一定都是相同的。您可能已经尝试过,并注意到缺少任何“foo”属性:

Object.keys(document.all)
// => ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "length"]
然而,“foo”实际上是文档的一个属性。您可以很容易地验证这一点:

document.all.foo;
// => [<div id=​"foo">​hello​</div>​, <div id=​"foo">​world​</div>​]

document.all.hasOwnProperty("foo") // => true

因此,最终这并不是一个谜。可以将任意属性分配给
文档.all
对象,就像它们可以分配给数组一样。这里就是这样;属性就是不可枚举。

我想我理解您为什么感到困惑。让我解释几件事来澄清任何困惑。有些你可能已经知道了,但为了安全起见,我将涵盖所有内容

首先,类似数组的对象仍然可以像其他对象一样具有属性。即使是一个普通的
数组
也是这样

var arr = [1, 2, 3];
arr.foo = "bar";
arr["foo"]; // => "bar"
因此,在解析DOM之后,浏览器使用与页面上每个ID对应的属性填充
document.all
,尽管
HTMLAllCollection
非常类似于数组,这似乎是完全合理的

其次,对象的属性不一定都是相同的。您可能已经尝试过,并注意到缺少任何“foo”属性:

Object.keys(document.all)
// => ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "length"]
然而,“foo”实际上是文档的一个属性。您可以很容易地验证这一点:

document.all.foo;
// => [<div id=​"foo">​hello​</div>​, <div id=​"foo">​world​</div>​]

document.all.hasOwnProperty("foo") // => true

因此,最终这并不是一个谜。可以将任意属性分配给
document.all
对象,就像数组一样。这里就是这样;属性不可枚举。

ID是唯一的。而且,
document.all
是非标准的,我并不是说我们都应该这样匆忙地编写代码。我只是想问,究竟是谁否决了这一点,通过什么机制才能奏效?糟糕的代码并不是否决某个问题的理由。我认为纯粹主义者会将任何敢于键入
文档的人钉死在十字架上。键盘上所有的
都否决了它。你问的是一个不受欢迎的非标准功能,并用它来做人们不应该做的事情。根据DOM规范,ID是唯一的,document.all甚至不是它的一部分。任何答案都将基于实现细节,并且是非标准的。ID是唯一的。而且,
document.all
是非标准的,我并不是说我们都应该这样匆忙地编写代码。我只是想问,究竟是谁否决了这一点,通过什么机制才能奏效?糟糕的代码不是否决某个问题的理由。我认为纯粹主义者会将任何敢于键入
的人钉死在十字架上