![](/img/trans.png)
[英]How can I test whether a Javascript object has a method with a given name?
[英]How can I test whether this Javascript object has any properties?
我有一些代碼可以向對象添加屬性,如下所示:
var MyObject = new Object();
if (....) { MyObject.prop1 = .... ; }
if (....) { MyObject.prop2 = .... ; }
if (....) { MyObject.prop3 = .... ; }
在完成所有這些if語句之后,我想測試並查看MyObject
是否具有屬性。 我不想測試它是否有prop1 || prop2 || prop3
prop1 || prop2 || prop3
prop1 || prop2 || prop3
因為有12個屬性可以添加。
我如何測試它是否至少有一個? 我試過if (MyObject)
但當然不行,因為它只測試對象的存在。 對於對象來說,這些就像一個簡單的單行(MyArray.length)
嗎?
如果你在ECMAScript5之前的環境中工作,那么使用一個小循環很容易:
var found = false, name;
for (name in MyObject) {
if (MyObject.hasOwnProperty(name)) {
found = true;
break;
}
}
或者因為你正在使用var MyObject = new Object();
創建它(BTW,你可以只使用var MyObject = {};
),你實際上並不需要hasOwnProperty
調用:
var found = false, name;
for (name in MyObject) {
found = true;
break;
}
for..in
循環for..in
一個對象的可枚舉屬性,它既有自己的屬性,也有從它的原型繼承的屬性; hasOwnProperty
告訴您屬性是來自對象本身還是原型。 您添加的所有屬性都是可枚舉的,因此它們將顯示在循環中。 原始對象( {}
)最初沒有可枚舉的屬性,除非有人一直在使用Object.prototype
(這是一個非常糟糕的想法 ),因此上面的第二個循環。
ECMAScript5(幾年前發布,不受舊版瀏覽器的支持,即使在最近的瀏覽器中支持也有所不同)添加了一些可用於此的功能。 可能最相關的是Object.keys
,它返回對象的“自己”屬性的名稱數組(不是它從原型繼承的屬性)。 這意味着你不需要循環:
if (Object.keys(MyObject).length) { // Only on ES5-compliant browsers
// Yes it has at least one
}
嘗試
Object.getOwnPropertyNames(MyObject).length;
這將為您提供對象自己的屬性數。
見文檔 。
Object.getOwnPropertyNames返回一個數組,其元素是與obj上直接找到的可枚舉和不可枚舉屬性相對應的字符串。
如果要支持沒有Object.getOwnPropertyNames
舊瀏覽器,請使用以下命令:
var getPropertyNames = Object.getOwnPropertyNames || function(obj) {
var propNames = [];
for (var propName in obj) {
if(obj.hasOwnProperty(propName)) {
propNames.push(propName);
}
}
return propNames;
}
getPropertyNames(MyObject).length; // number of own properties
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.