Javascript:确保参数产生有效的HTML元素(类型检查)

时间:2014-03-27 04:58:32

标签: javascript getelementbyid typechecking

我一直在浏览一些旧的代码,其中很多都使用了我在线抓取的代码片段。我遇到了一些需要元素作为参数的借用函数,但是这个元素既可以作为元素本身传递,也可以作为.getElementById()中使用的字符串传递。以下哪两个更好,为什么?还是有更好的版本? (更好=可读,标准,安全)

版本1

function doSomethingWithElem( elem /*, param2, ... */ ) {
    elem = (typeof elem === 'string' || elem instanceof String)
         ?  document.getElementById( elem )
         :  elem;

    // more stuff...
}

版本2

function doSomething2( elem /*, param2, ... */ ) {
    elem = document.getElementById( elem ) || elem;

    // more stuff...
}

主要区别在于,在调用gEBI之前检查字符串实例,而另一个依赖于返回undefined的gEBI。他们都没有检查以确保elem确实是HTMLElement

假设一个定义良好的API(用户知道应该传递一个字符串或HTML元素),那么类型检查有多重要?是否需要进行类型检查以帮助脚本用户调试自己的代码?是否存在其中任何一个的细微陷阱,例如gEBI的可能返回值可能会弄乱版本2?

1 个答案:

答案 0 :(得分:1)

我会使用版本1,因为它更具可读性。你看到它处理2个案例,更清楚的是,其中一个是一个字符串,另一个是直接元素。 我从来没有见过针对instanceof String的检查,至于我在99%的人中使用字符串原语的经验。 我对gEBI进行了一些测试,它看起来非常强大,它只会返回null,因为任何无效的东西(数组,函数,对象......)。

至于检查elem实际上是否为HTML元素,请参阅:JavaScript isDOM -- How do you check if a JavaScript Object is a DOM Object?