2

我认为每个元素返回document.getElementByIddocument.createElement实际上是 dom 元素的某个版本,并且可以使用typeof. script但是,我最近发现,当我尝试对和link标记这样做时,情况并非如此。

jsFiddle Demo

html

<link id="l">
<script id="s">

js

var l = document.getElementById("l");
console.log(typeof l);//"object"
var s = document.getElementById("s");
console.log(typeof s);//"object"
var li = document.createElement("link");
console.log(typeof li);//"object"
var sc = document.createElement("script");
console.log(typeof sc);//"object"

为什么将这些元素类型化为对象?

4

2 回答 2

4

它们是元素,您得到的结果与其他类型的元素相同。

尝试这个 :

var li = document.createElement("link");
console.log(li instanceof HTMLElement);

它记录true为链接是HTMLLinkElement的一个实例,它是HTMLElement.

但是typeof只是"object"为大多数对象(“任何其他对象”)返回。

您可以使用getPrototypeOf获取对象的类型:

console.log(Object.getPrototypeOf(li));
于 2013-04-19T20:31:51.810 回答
3

typeof专门用于原生 JavaScript 对象。typeof将返回一组非常有限的值。

"object"响应基本上是针对任何对象的,或者(null 实际上不是对象……看图)。您可能会从任何类型的 Element 中得到相同的响应,而不仅仅是scriptand link

您可以使用instanceof来查看元素是否是Element构造函数原型的实例。

console.log(l instanceof Element); // true

请注意,像元素及其构造函数这样的对象是宿主对象。它们有时会使用与原生 JavaScript 对象不同的规则,因此在测试它们的类型时可能会到处出现怪癖。

于 2013-04-19T20:31:05.857 回答