我认为从document.getElementById
或document.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"
为什么这些元素被输入为对象?
答案 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
(实际上不是对象......去图)。您可能会从任何类型的元素获得相同的响应,而不仅仅是script
和link
。
您可以使用instanceof
查看该元素是否是Element
构造函数原型的实体。
console.log(l instanceof Element); // true
请注意,元素及其构造函数之类的对象是宿主对象。它们有时会使用与原生JavaScript对象不同的规则,因此在测试其类型时可能会出现问题。