以下两个示例似乎都有效。我只是想知道两者之间有什么区别,并且两者都如何起作用?
if (a[b].hasOwnProperty(c)) {return "Works";}
if (a[b][c]) {return "Works";}
但是,以下内容由于某种原因似乎引起很多问题,尽管它似乎应该可以工作:
if (typeof(a[b][c]) !== undefined) {return "Works";}
我只是不明白到底怎么了。
非常感谢,我才刚开始,所以可能很简单。
答案 0 :(得分:5)
typeof x
永远不能是undefined
;它永远是一个字符串。该字符串可以是"undefined"
,但不是undefined
。
尽管a[b].hasOwnProperty(c)
和a[b][c]
之间存在差异:
a[b][c]
将为false
(如果值存在但为falsy one (false
, 0
, ""
, NaN
, null
, undefined
))。hasOwnProperty
仅查看对象本身内的属性,而不查看原型链上的属性。 (但是,即使是伪造的值,它也会返回true
。)答案 1 :(得分:2)
typeof
operator返回一个字符串,并且支票应与字符串一起使用。
顺便说一句,它不是一个函数,它是一个不带括号的运算符。
if (typeof a[b][c] !== 'undefined') {
return "Works";
}
您可以使用in
operator进行确认。
if (c in a[b]) {
return "Works";
}
答案 2 :(得分:1)
有些属性可以在对象原型上定义,而另一些属性可以在对象本身上定义。
function O(){ this.bar = "bar" }
O.prototype.foo = "foo"
var o = new O
Object.hasOwnProperty(o,'foo') // false
Object.hasOwnProperty(o,'bar') // true
还
console.log(o.foo) // displays 'foo'
您的代码段
if (a[b][c]) {return "Works";}
测试javascript认为“真实”值的内容。如果b上不存在属性c,则该测试的评估结果为false
https://developer.mozilla.org/en-US/docs/Glossary/Truthy
要测试是否以某种形式定义了属性,请使用
if(typeof a.b !== 'undefined'){ console.log('a has a property named b') }
注意:它是“未定义”的字符串,而不是未定义的。