我被建议改变这个:
if ( typeof user.account.products !== 'undefined') {}
到此:
if (user.account && user.account.hasOwnProperty('products'))
在第二个示例中,添加了user.account作为额外的防御措施,它是有效的。现在另一部分让我很好奇。
我理解它的作用,但仍然无法将我的头部包裹起来。
答案 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)更优雅 - 而不是假设该属性存在,然后检查它是否已定义,您将询问该对象是否具有此属性。