我有以下代码
var commentId = 1834;
alert("getElementsByName:: " + typeof(document.getElementsByName("tmp_airDiff" + commentId)[0]));
alert("getElementById:: " + typeof(document.getElementById("tmp_airDiff" + commentId)));
文档中没有tmp_airDiff1834
作为ID或名称的元素。
然而,这就是我得到的回报:
getElementsByName:: undefined
getElementById:: object
当文档中没有此类对象时,有人解释了getElementById
在使用object
时返回typeof
的原因吗?
答案 0 :(得分:10)
你很困惑,因为
typeof null === "object"
和getElementById
返回null
。
是的,这很奇怪,就像typeof NaN === "number"
,但是that's how it works。
在getElementsByName
的情况下,您输出undefined
的类型,这是您从数组(或类似数组的对象)访问元素时获得的类型
[][1] === undefined
通过更适应的调试练习,你不会感觉到这个陷阱。而不是使用
alert("some name : " + typeof(someValue))
你最好use the console of your browser:
console.log("some name :", someValue)
请注意,如果在if
中进行测试,则会产生统一的行为:
if (document.getElementsByName("tmp_airDiff" + commentId)[0]) {
// never goes there as undefined is falsy
}
if (document.getElementById("tmp_airDiff" + commentId)) {
// never goes there as null is falsy
}
答案 1 :(得分:3)
原因是document.getElementById()
在找不到具有给定ID的元素时返回null
。 typeof(null)
会返回object
。
答案 2 :(得分:3)
如果找不到元素并且getElementById
是对象
,则简单typeof null
返回null
getElementsByName
返回一个集合,如果它为空,则任何索引都将是未定义的typeof undefined
未定义。
答案 3 :(得分:1)
getElementsByName
返回undefined
的原因是因为它返回array
,并且您引用的是不存在的索引。举个例子:
var array = [];
array[2320]; //undefined
array[0]; //undefined
另一方面, getElementById
在找不到元素时返回null
(它不返回空数组)。