JavaScript中hasOwnProperty和if(a [b] [c])之间的区别

时间:2018-08-12 19:44:34

标签: javascript

以下两个示例似乎都有效。我只是想知道两者之间有什么区别,并且两者都如何起作用?

if (a[b].hasOwnProperty(c)) {return "Works";}

if (a[b][c]) {return "Works";}

但是,以下内容由于某种原因似乎引起很多问题,尽管它似乎应该可以工作:

if (typeof(a[b][c]) !== undefined) {return "Works";}

我只是不明白到底怎么了。

非常感谢,我才刚开始,所以可能很简单。

3 个答案:

答案 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') }

注意:它是“未定义”的字符串,而不是未定义的。