上下文:
我正在尝试确保在使用它之前传递给函数的对象是有效的。我想知道这两种方法之间是否存在任何差异,一种语法比另一种语法更冗长。如果现代用户代理(如Chrome,IE,FF等)使用的所有JavaScript引擎的功能和行为相同,我宁愿使用更简单的版本。如果没有,我想使用安全投注,所以无论JavaScript引擎的实现如何,我的代码都按照我的意图行事。
问题:
鉴于以下功能,有两个陈述,如评论部分所示 无论JS引擎(或用户代理)如何,语句1是否与语句2产生相同的结果?为什么或为什么不呢?
function f(obj) {
if(obj) { // statement 1
console.log('obj is valid');
}
if(obj !== null && obj!==undefined) { // statement 2
console.log('obj is invalid');
}
}
答案 0 :(得分:6)
不,他们是不同的。
if (obj)
测试 truthy 值。在JavaScript中,除了""
,0
,false
,NaN
,null
和undefined
之外,一切都很简洁(可能还有一些我忘了......)
但是,如果其中一个假值是你可以使用的值,例如零或false
? quantity
为零是完全合法的值,false
为isTotallyLame
。所以你需要一个允许这些值通过的测试。您需要测试存在。
if (obj!==null && obj!==undefined)
测试存在。只有null
或undefined
才会通过测试。这意味着空字符串""
,零0
或甚至false
都是有效值,因为它们是设定值。
但是,正如@Tim所说,存在的首选标准测试如下:
if (typeof obj !== "undefined" && obj !== null)