我正在检查对象属性是否存在,该变量包含一个持有问题的属性名称。
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
我正在检查对象属性是否存在,该变量包含一个持有问题的属性名称。
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
Answers:
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')
并非如此。
hasOwnProperty()
更好myObj[myProp]
(从其他答案中得出),因为即使它的值为myProp
0 ,它也可以工作
'qqq'.hasOwnProperty('length')
是的true
,您可以做到。
myProp
为0,则if语句看起来像if (myObj[0])
哪个if完全myObj
具有任何属性,该表达式的计算结果为true
。而且myObj[0]
可能不是你要找的财产。
您可以使用hasOwnProperty,但是基于引用,使用此方法时需要引号:
if (myObj.hasOwnProperty('myProp')) {
// do something
}
另一种方法是在运算符中使用,但您也需要在这里加上引号:
if ('myProp' in myObj) {
// do something
}
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/in
谢谢大家的帮助,并努力摆脱eval声明。变量需要放在方括号中,而不是点号。这可以正常工作,并且是正确的代码。
这些都是变量:appChoice,underI,underObstr。
if(typeof tData.tonicdata[appChoice][underI][underObstr] !== "undefined"){
//enter code here
}
tData.tonicdata[appChoice]
结果值不具有匹配的属性/索引,underI
则将导致TypeError
抛出该值。
对于自己的财产:
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'
};
要在发现中包括继承的属性,请使用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
}
检查对象属性是否存在的一种更安全的方法是使用空对象或对象原型进行调用 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
hasOwnProperty
,那么没有任何类似的防护措施可以确保您的代码安全。
hasOwnProperty
方法被覆盖,则可以依靠Object.prototype.hasOwnProperty.call(object, property)
。”