为什么链接和脚本标记没有键入元素?

时间:2013-04-19 20:28:28

标签: javascript types

我认为从document.getElementByIddocument.createElement返回的每个元素实际上都是dom元素的某个版本,并且可以使用typeof找到该版本。但是,我最近发现当我尝试对scriptlink标记执行此操作时并非如此。

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"

为什么这些元素被输入为对象?

2 个答案:

答案 0 :(得分:4)

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

试试这个:

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

它记录true,因为该链接是HTMLLinkElement的一个实例,它是HTMLElement的特化。

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

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

console.log(Object.getPrototypeOf(li));

答案 1 :(得分:3)

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

"object"响应基本上适用于任何对象,或null (实际上不是对象......去图)。您可能会从任何类型的元素获得相同的响应,而不仅仅是scriptlink

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

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

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