Javascript - 正确的类型检查方式

时间:2017-05-10 13:17:59

标签: javascript

我被建议改变这个:

if ( typeof user.account.products !== 'undefined') {}

到此:

if (user.account && user.account.hasOwnProperty('products'))

在第二个示例中,添加了user.account作为额外的防御措施,它是有效的。现在另一部分让我很好奇。

我理解它的作用,但仍然无法将我的头部包裹起来。

3 个答案:

答案 0 :(得分:2)

第一次检查意味着

if ( typeof user.account.products !== 'undefined') {
   // i will execute if products property is defined on user.account
   // even is null or 0
}

第二项检查意味着(简化)

if (user.account.hasOwnProperty('products')) {
   // i will execute if user.account has a property of "products" even if products property is undefined/null/0 
   // and also i wont be executed if user.account is inherited from something has its own 
   // "products" property but not defined on user.account's prototype (inherited property).

}  

还有第三个选项,你没有提到这是

if ('products' in user.account) {
  // i will execute if user.account has a property of
  // "products" even if products property is undefined/null/0
}

答案 1 :(得分:1)

如果某个属性不存在,并且您尝试获取其类型或值,则会获得undefined。如果将undefined转换为布尔值(这是if/then语句对作为条件提供的表达式的作用),则会得到false,因为某些值为 {{3} 和其他 truthy

因此,这是一种非undefined的明确测试方法:

if ( typeof user.account.products !== 'undefined') {}

而且,这是做同样事情的隐含方式:

if (user.account.products)

现在你的行:

if (user.account && user.account.hasOwnProperty('products'))

比其中任何一个更具体,因为它不仅测试是否存在user.account,还测试该对象是否具有自己的products属性。如果您打算使用该属性,并且user.account可能不存在或可能存在,但可能没有products作为属性,那么这是测试的最佳方式它

但是,还有其他方法可以进行此类测试。这样:

if(account in user && products in user.account)

检查其主机对象中是否存在相应的属性,而不考虑属性是否继承。

但是,最后,如果它是你关心的products财产,你真正需要的是:

if(products in user.account);

如果products不存在或user.account无效,此测试将失败。

这完全取决于您想要测试的粒度。

答案 2 :(得分:0)

如果我正确地提出您的问题,您会问为什么使用:

user.account.hasOwnProperty('products')

而不是:

user.account.products !== undefined

在这种情况下,这两个选项是有效的。有了这个说法,新选项(hasOwnProperty)更优雅 - 而不是假设该属性存在,然后检查它是否已定义,您将询问该对象是否具有此属性。