getElementById返回对象,getElementsByName返回none

Rob*_*ron 1 javascript dom

我有以下代码

var commentId = 1834;

alert("getElementsByName:: " + typeof(document.getElementsByName("tmp_airDiff" + commentId)[0]));   
alert("getElementById:: " + typeof(document.getElementById("tmp_airDiff" + commentId)));
Run Code Online (Sandbox Code Playgroud)

tmp_airDiff1834文档中没有包含id或name的元素.

然而,这就是我得到的回报:

getElementsByName:: undefined
getElementById:: object
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么在使用时getElementById返回,当文档中没有这样的对象时?objecttypeof

Den*_*ret 10

你很困惑,因为

typeof null === "object"
Run Code Online (Sandbox Code Playgroud)

getElementById返回null.

是的,这很奇怪,就像typeof NaN === "number",但它是如何工作的.

在此输入图像描述

在这种情况下getElementsByName,您输出的类型undefined是从数组(或类似数组的对象)访问元素时获得的类型.

[][1] === undefined
Run Code Online (Sandbox Code Playgroud)

通过更适应的调试练习,你不会感觉到这个陷阱.而不是使用

alert("some name : " + typeof(someValue))
Run Code Online (Sandbox Code Playgroud)

你最好使用浏览器的控制台:

console.log("some name :", someValue)
Run Code Online (Sandbox Code Playgroud)

请注意,如果测试时您将具有统一的行为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
}
Run Code Online (Sandbox Code Playgroud)

  • 除了Notepad ++和警报之外,你还让我开始使用其他东西.史诗按钮在哪里?! (2认同)