如何使用保存属性名称的变量检查对象属性是否存在?


679

我正在检查对象属性是否存在,该变量包含一个持有问题的属性名称。

var myObj;
myObj.prop = "exists";
var myProp = "p"+"r"+"o"+"p";

if(myObj.myProp){
    alert("yes, i have that property");
};

这是undefined因为它正在寻找myObj.myProp但我要它检查myObj.prop


2
可能有用:摘自NCZOnline的Pablo Cabrera的评论:“我认为值得注意的是,如果该hasOwnProperty方法被覆盖,则可以依靠Object.prototype.hasOwnProperty.call(object, property)。”
HumanInDisguise

10
stackoverflow.com/questions/4244896/…这个问题的重复吗?那个怎么样?“检查存在”和“获取价值”是不同的东西吗?如果我错了,请指正我....
adnan2nd

这不是重复的。
杰夫·克莱顿

Answers:


1306
var myProp = 'prop';
if(myObj.hasOwnProperty(myProp)){
    alert("yes, i have that property");
}

要么

var myProp = 'prop';
if(myProp in myObj){
    alert("yes, i have that property");
}

要么

if('prop' in myObj){
    alert("yes, i have that property");
}

请注意,hasOwnProperty它不会检查继承的属性,而in会检查。例如,'constructor' in myObj是正确的,但事实myObj.hasOwnProperty('constructor')并非如此。


23
hasOwnProperty()更好myObj[myProp](从其他答案中得出),因为即使它的值为myProp0 ,它也可以工作
Matt R

9
“ in”运算符不适用于字符串。例如,“ qqq”中的“ length”将产生异常。因此,如果要进行通用检查,则需要使用hasOwnProperty。
2014年

1
@Jacob当您说“ in运算符不适用于字符串”时,您是什么意思?使用“ in”运算符,左表达式必须是字符串或可以转换为字符串的值。是的,您不能在“ qqq”中写“ length”,但也不能写“ qqq” .hasOwnProperty('length')之一
Wachburn

2
@Wachburn:'qqq'.hasOwnProperty('length')是的true,您可以做到。
火箭Hazmat

1
@ gaurav5430我相信我要指的是,如果myProp为0,则if语句看起来像if (myObj[0])哪个if完全myObj具有任何属性,该表达式的计算结果为true。而且myObj[0]可能不是你要找的财产。
Matt R

51

您可以使用hasOwnProperty,但是基于引用,使用此方法时需要引号

if (myObj.hasOwnProperty('myProp')) {
    // do something
}

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

另一种方法是运算符中使用,但您也需要在这里加上引号

if ('myProp' in myObj) {
    // do something
}

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/in


6
这是不是如何hasOwnProperty()实现的。
佳能2015年

7
这是不正确的。通过在名称myProp周围加上引号,您不再引用myProp的值,而是声明了一个新的String()为'myProp',并且myObj中没有这样的'myProp'属性。
TriumphST

1
TriumpST:来自上面链接的MDN,“ prop-代表属性名称或数组索引的字符串或符号(非符号将被强制转换为字符串)”。
Ben Creasy

这是对的。如果您不想使用变量,而只是存在特定的“ myProp”,则需要使用引号。
Katinka Hesselink,

@KatinkaHesselink:您的评论具有误导性。问题是“如何检查对象属性是否存在带有保存属性名称的变量?”
Herbert Van-Vliet

26

谢谢大家的帮助,并努力摆脱eval声明。变量需要放在方括号中,而不是点号。这可以正常工作,并且是正确的代码。

这些都是变量:appChoice,underI,underObstr。

if(typeof tData.tonicdata[appChoice][underI][underObstr] !== "undefined"){
    //enter code here
}

这对我来说似乎是个问题。如果tData.tonicdata[appChoice]结果值不具有匹配的属性/索引,underI则将导致TypeError抛出该值。
Ynot

尽管您打算在最初的帖子中发表意图,但实际上您提出的问题与您提供此答案的问题不同。您想检查属性的存在,没有提及任何有关如何访问它的信息。这使得该答案与实际问题无关。
牧草

18

对于自己的财产:

var loan = { amount: 150 };
if(Object.prototype.hasOwnProperty.call(loan, "amount")) 
{ 
   //will execute
}

注意:如果在原型链中定义了自定义的hasOwnProperty(此处不是这种情况),则使用Object.prototype.hasOwnProperty优于loan.hasOwnProperty(..)

var foo = {
      hasOwnProperty: function() {
        return false;
      },
      bar: 'Here be dragons'
    };

// https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

要在发现中包括继承的属性,请使用in运算符:(但您必须将一个对象放在'in'的右侧,原始值将引发错误,例如 'home'中的'length'将引发错误,但是 'length'在新的String('home')中不会)

const yoshi = { skulk: true };
const hattori = { sneak: true };
const kuma = { creep: true };
if ("skulk" in yoshi) 
    console.log("Yoshi can skulk");

if (!("sneak" in yoshi)) 
    console.log("Yoshi cannot sneak");

if (!("creep" in yoshi)) 
    console.log("Yoshi cannot creep");

Object.setPrototypeOf(yoshi, hattori);

if ("sneak" in yoshi)
    console.log("Yoshi can now sneak");
if (!("creep" in hattori))
    console.log("Hattori cannot creep");

Object.setPrototypeOf(hattori, kuma);

if ("creep" in hattori)
    console.log("Hattori can now creep");
if ("creep" in yoshi)
    console.log("Yoshi can also creep");

// https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/in

注意:可能很想使用typeof和[]属性访问器,因为以下代码并不总是有效的 ...

var loan = { amount: 150 };

loan.installment = undefined;

if("installment" in loan) // correct
{
    // will execute
}

if(typeof loan["installment"] !== "undefined") // incorrect
{
    // will not execute
}

13

检查对象属性是否存在的一种更安全的方法是使用空对象或对象原型进行调用 hasOwnProperty()

var foo = {
  hasOwnProperty: function() {
    return false;
  },
  bar: 'Here be dragons'
};

foo.hasOwnProperty('bar'); // always returns false

// Use another Object's hasOwnProperty and call it with 'this' set to foo
({}).hasOwnProperty.call(foo, 'bar'); // true

// It's also possible to use the hasOwnProperty property from the Object
// prototype for this purpose
Object.prototype.hasOwnProperty.call(foo, 'bar'); // true

来自MDN Web文档的引用-Object.prototype.hasOwnProperty()


4
如果您合并的JavaScript可能会执行诸如override之类的邪恶行为hasOwnProperty,那么没有任何类似的防护措施可以确保您的代码安全。
meustrus '18

@meustrus我知道您来自哪里,但是从业务角度来看,很有可能会遇到一个经验不足的开发人员会使用此属性名称的情况,这不一定意味着他们故意在做恶事。
skmasq

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.