我一直在浏览一些旧的代码,其中很多都使用了我在线抓取的代码片段。我遇到了一些需要元素作为参数的借用函数,但是这个元素既可以作为元素本身传递,也可以作为.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?
答案 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?