在JavaScript中,对象如何;obj";这并不意味着';不要将财产命名为;"富",;是否能够使用obj[“foo”给出一个值?
我在《JavaScript忍者的秘密》一书中读到,如果浏览器支持,我们可以使用在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
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
是非标准的,我并不是说我们都应该这样匆忙地编写代码。我只是想问,究竟是谁否决了这一点,通过什么机制才能奏效?糟糕的代码不是否决某个问题的理由。我认为纯粹主义者会将任何敢于键入的人钉死在十字架上