跨浏览器javascript的对象/函数存在性测试

跨浏览器javascript的对象/函数存在性测试,javascript,coding-style,cross-browser,Javascript,Coding Style,Cross Browser,我想就跨浏览器兼容性测试对象存在性的最佳实践提出建议 似乎有很多方法可以测试对象/函数/属性是否存在。我可以使用jquery或其他库,但现在我想尽可能地使用w3c,而不是使用一种全新的语言 我想做什么 我正在尝试编写一个实用程序库,它试图坚持w3c方法,这样我就可以调用 xAddEventListener(elem, type, listener, useCapture) 适用于所有浏览器,而不是 elem.AddEventListener(type, listener, useCapture

我想就跨浏览器兼容性测试对象存在性的最佳实践提出建议

似乎有很多方法可以测试对象/函数/属性是否存在。我可以使用jquery或其他库,但现在我想尽可能地使用w3c,而不是使用一种全新的语言

我想做什么 我正在尝试编写一个实用程序库,它试图坚持w3c方法,这样我就可以调用

xAddEventListener(elem, type, listener, useCapture)
适用于所有浏览器,而不是

elem.AddEventListener(type, listener, useCapture)
仅适用于w3c兼容浏览器。如果其他图书馆已经这样做了,请让我知道

我今天看到了:

if (typeof node.addEventListener == "function")
if (typeof node.addEventListener == "function")
但这会不会产生一个不同于普通的结果

if (node.addEventListener)
if (node.addEventListener)
样式文档? 参考标准或样式文档也很有用。我找到了 但最近一次更新是在2003年。它提倡简单

if (document.images)
大多数存在性测试和

if (typeof(window.innerHeight) == 'number')
仅使用数字,因为if(0)的计算结果为false

启发评论的例子: 一个对象或函数能通过这个简单的测试吗

if (myObject != undefined)
什么时候比之前的测试更好

if (typeof(myObject) == 'object')
这似乎是调用type of的原始方式,但有些人说typeof是一个关键字,而不是一个函数。还有,为什么不做一个更简单的测试呢

if ( typeof myObject.function !== undefined ) {
一篇帖子说总是使用===或!==因为它区分空和未定义。这在实践中是否很重要

另一种可能性是:

try {
    node.addEventListener(...)
} 
catch(err) {
    node.attachEvent(...)
}
在python中,它似乎正在成为处理这类事情的首选方式

使用异常看起来可能更干净,因为您可以编写易于理解的w3c兼容代码,然后在出现异常时处理异常


不管怎样,人们怎么想?请列出你喜欢/不喜欢的方法的优缺点,而不是简单地宣传你最喜欢的方法

这完全取决于在调用函数之前您希望的具体程度/您希望断言的程度


一个对象或函数能通过这个简单的测试吗

if (myObject != undefined)
否,如果<代码>子句<代码>不通过的唯一值是<代码>false<代码>,<代码>0<代码>,<代码>,<代码>NaN<代码>,<代码>未定义<代码>和<代码>null<代码>。这些都是原语。对象(包括函数)将始终传递
if
子句


什么时候比之前的测试更好

如果要检查值是否“有意义”,即不是
未定义
。比如说,

if(numberInputtedByUser) {
    // do something with inputted number
}
如果数字为
0
,则
if
子句将失败,而您可能希望允许
0
。在这种情况下,
!=undefined
是一个稍微好一点的检查


这似乎是调用type of的原始方式,但有些人说typeof是一个关键字,而不是一个函数。还有,为什么不做一个更简单的测试呢

if ( typeof myObject.function !== undefined ) {
这是一个关键词。不过,您可以用类似于fashion的函数调用它。在最简单的形式中,您可以像这样使用
typeof

typeof myObject
但是,您可以添加(无关)参数,因为它们没有任何意义:

typeof (myObject)
就像你能做的那样:

(myObject).key
甚至:

(((myObject))).key
然后,如果需要,您可以删除
type of
后面的空格,从而生成类似于函数调用的内容

至于为什么要使用
typeof
,您可以更确定变量的类型。使用
if(…)
测试,通过的值可以是所有类型的东西——基本上是所有东西,除了我上面发布的列表。使用
如果(…!=undefined)
,则允许传递更多信息。使用
if(typeof…=='object')
,您实际上只允许根据您正在处理的内容可能需要的对象


一篇帖子说总是使用===或!==因为它区分空和未定义。这在实践中是否很重要

==
确实比
=
更受欢迎。虽然区分
null
undefined
并不总是必要的,但这是一种很好的做法,可以避免出现类似
0=''
的怪癖。如果要检查一个数字是否为
0
,那么
==0
是一个好办法,因为
==0
也允许使用空字符串(您可能不希望也可能不希望)。即使在
=
不会引起怪癖的情况下,您最好始终使用
==
以保持一致性并避免意外的错误


这当然是可能的,而且非常直截了当。然而,请注意,
try-catch
被认为是缓慢的。此外,你没有真正解释它失败的原因。这有点简单(但可能行得通)


但这会不会产生一个不同于普通的结果

if (node.addEventListener)
if (node.addEventListener)
是的,正如我上面所说,第一个只传递函数,而第二个只允许“falsy”值列表之外的任何内容。可以添加
Node.addEventListener=123
,它将在第二种情况下传递
if
子句IE未能给出正确的类型结果:

typeof alert !== "function"
我打赌
addEventListener
也是如此,所以即使该函数存在,您仍然会避免使用它



最后,我将使用一个简单的
if
子句。当然,当您添加像
Node.addEventListener=123这样的奇怪的东西时,这会失败,但是您肯定会期待奇怪的事情发生。

如果您想知道jQuery是如何做到这一点的,它使用了一个简单的
If
子句:。谢谢,这非常有用。我曾经考虑过深入研究jQuery代码,但不知道从哪里开始。非常感谢,这正是我想要的。
myObject.function!==未定义myObject.function的类型!='未定义“
@Richard:是和否。它们都检查
未定义的不平等性。但是如果你设置if (node.addEventListener)
typeof alert !== "function"