Inconsistant JavaScript返回值

时间:2016-12-23 15:43:52

标签: javascript null undefined return-value

为什么getElementById()如果ID不存在则返回null,如果类不存在则getElementsByClassName()返回undefined?这似乎是JavaScript语言中的不一致,因为两者都是DOM方法。例如:

console.log( document.getElementById('bogusID') ); // null
console.log( document.getElementsByClassName('bogusClass')[0] ); // undefined

我最近不得不找出困难的方法,因为我错误地假设两种方法都会返回" undefined"失败。

实际上是否存在不同返回值的原因?

3 个答案:

答案 0 :(得分:3)

console.log( document.getElementById('bogusID') ); // null

多数民众赞成是因为您的DOM上没有bogusID项目所以返回为空

console.log( document.getElementsByClassName('bogusClass')[0] ); // undefined

这是因为你得到的数组的索引0在0指针处没有元素。所以数组的索引0没有被定义(未定义)

答案 1 :(得分:3)

document.getElementsByClassName('bogusClass')返回一个空数组,并且您正在尝试访问不存在的第0个元素,因此您获得undefined

与其他编程语言不同,Javascript不会使索引超出范围异常,因为索引是作为属性实现的,并且访问不存在的属性会返回{{1} }。

undefinednull的检查和处理方面,javascript中的undefined值均为falsy,因此对于这两种情况,您的代码应该相同。

if(condition){
// Both undefined and null would not pass the condition.
}

答案 2 :(得分:2)

我不知道程序是如何在内部为getElementById() & getElementByClass定义的,但是根据mozilla文档getElementById()基本上会向元素返回一个引用(对象)。

<强> ID 例如:element = document.getElementById() 返回值

元素 - 是对 Element 对象的引用,如果具有指定ID的元素不在文档中,则为null。在dom中,应该只有一个ID具有相同的名称,因此ID名称中没有重用。

<强>类

例如:var elements = element.getElementsByClassName(names);

getElementsByClassName()方法返回包含所有子元素的实时 HTMLCollection ,其中包含所有给定的类名。在文档对象上调用时,将搜索完整文档,包括根节点。 在dom中,只有一个ID具有相同的名称,因此ID名称中没有重用,并且 HTMLCollection 使用数组来收集使用classname引用的所有元素。

未定义表示已声明变量但尚未分配值。另一方面, null 是一个赋值。它可以作为无值的表示分配给变量。

此外,undefined和null是两种不同的类型:undefined是一个类型本身(未定义),而null是一个对象。