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

IT技术 javascript object
2021-02-04 21:59:40

我正在检查对象属性是否存在,其中的变量包含相关属性名称。

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

6个回答
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')不是。

为避免破坏 eslintno-prototype-builtins规则,您应该使用Object.prototype.hasOwnProperty.call(myObj, myProp)而不是myObj.hasOwnProperty(myProp)
2021-03-22 21:59:40
@Wachburn:'qqq'.hasOwnProperty('length')是的true,你可以做到。
2021-03-24 21:59:40
“in”运算符不适用于字符串。例如,'qqq' 中的'length' 会产生异常。因此,如果您想要进行通用检查,则需要使用 hasOwnProperty。
2021-03-26 21:59:40
@Jacob 当您说““in”运算符不适用于字符串时,您是什么意思?使用 "in"' 运算符,左表达式必须是可以转换为字符串的字符串或值。是的,你不能在 'qqq' 中写 'length' 但你也不能写 'qqq'.hasOwnProperty('length')
2021-03-30 21:59:40
hasOwnProperty()更好myObj[myProp](来自其他答案),因为即使 的值为myProp0它也能工作
2021-04-07 21:59:40

您可以使用hasOwnProperty,但根据参考,使用此方法时需要引号

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

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

另一种方法是使用in运算符,但这里也需要引号

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

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in

这是不正确的。通过在名称 myProp 周围加上引号,您不再引用 myProp 的值,而是声明了一个新的 String() 'myProp',并且在 myObj 中没有这样的 'myProp' 属性。
2021-03-14 21:59:40
不是如何hasOwnProperty()实施的。
2021-03-16 21:59:40
@KatinkaHesselink:您的评论具有误导性。问题是“如何使用保存属性名称的变量检查对象属性是否存在?”
2021-03-23 21:59:40
这是对的。如果您不想使用变量,而只是存在特定的“myProp”,则需要引号。
2021-04-01 21:59:40
TriumpST:来自上面链接的 MDN,“prop - 表示属性名称或数组索引的字符串或符号(非符号将被强制转换为字符串)。”
2021-04-06 21:59:40

感谢大家的帮助和推动摆脱 eval 语句。变量需要在括号中,而不是点符号。这有效并且是干净,正确的代码。

每一个都是变量:appChoice、underI、underObstr。

if(typeof tData.tonicdata[appChoice][underI][underObstr] !== "undefined"){
    //enter code here
}
这对我来说似乎是个问题。如果tData.tonicdata[appChoice]结果的值没有匹配的属性/索引underI,那么这将导致TypeError抛出。
2021-03-19 21:59:40
尽管您最初的帖子是有意为之,但您实际上提出了与您提供此答案的问题不同的问题。您想检查属性是否存在,但没有提及有关如何访问它的任何内容。这使得这个答案与实际问题无关。
2021-04-07 21:59:40

对于自有财产:

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

注意:使用Object.prototype.hasOwnProperty比 Loan.hasOwnProperty(..) 好,以防在原型链中定义了自定义 hasOwnProperty(这里不是这种情况),例如

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

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

要在发现中包含继承的属性,请使用in运算符:(但您必须将一个对象放在 'in' 的右侧,原始值将抛出错误,例如 'home' 中的 'length'将抛出错误,但'length'在 new 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/en-US/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
}

检查对象上是否存在属性的更安全的方法是使用空对象或对象原型来调用 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 网络文档的参考- Object.prototype.hasOwnProperty()

如果您正在合并可能执行诸如 override 之类的邪恶行为的 JavaScript,那么hasOwnProperty再多的保护措施都不会使您的代码安全或可靠。
2021-03-24 21:59:40
@meustrus 我知道你来自哪里,但从商业角度来看,很有可能没有经验的开发人员会使用这个属性名称,这并不一定意味着他们故意做一些邪恶的事情。
2021-04-03 21:59:40