JavaScript でオブジェクトに特定のプロパティがあるかどうかを確認するにはどうすればよいですか?
考慮する:
x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
//Do this
}
他に方法はありますか?
ベストアンサー1
2022年更新
Object.hasOwn()
Object.hasOwn()
Object.hasOwnProperty()
は、継承されたメソッドを使用して作成されたオブジェクトObject.create(null)
や、継承されたメソッドをオーバーライドしたオブジェクトで機能するため、より推奨されます。外部オブジェクトをhasOwnProperty()
呼び出すことでこれらの問題を回避することは可能ですが、より直感的です。Object.prototype.hasOwnProperty()
Object.hasOwn()
例
const object1 = {
prop: 'exists'
};
console.log(Object.hasOwn(object1, 'prop'));
// expected output: true
元の回答
与えられた回答には本当に困惑しています。ほとんどがまったく間違っています。もちろん、未定義、null、または false 値を持つオブジェクト プロパティが存在する可能性があります。したがって、プロパティ チェックを または に単純に減らすとtypeof this[property]
、さらに悪いことに、x.key
完全に誤解を招く結果になります。
それは、何を探しているかによります。オブジェクトに物理的にプロパティが含まれているかどうか (そしてそれがプロトタイプ チェーンのどこかから来ていないかどうか) を知りたい場合は、これobject.hasOwnProperty
が最適な方法です。すべての最新のブラウザーがこれをサポートしています。(Safari の古いバージョン (2.0.1 以前) にはこの機能はありませんでしたが、これらのバージョンのブラウザーは現在はほとんど使用されていません。)
オブジェクトに反復可能なプロパティがあるかどうかを調べたい場合は (オブジェクトのプロパティを反復すると、それが表示されます)、次のようにするとprop in object
目的の効果が得られます。
おそらく使用するのhasOwnProperty
が望ましいでしょうし、フォールバック メソッドが必要になる可能性もあることを考慮して、次の解決策を提示します。
var obj = {
a: undefined,
b: null,
c: false
};
// a, b, c all found
for ( var prop in obj ) {
document.writeln( "Object1: " + prop );
}
function Class(){
this.a = undefined;
this.b = null;
this.c = false;
}
Class.prototype = {
a: undefined,
b: true,
c: true,
d: true,
e: true
};
var obj2 = new Class();
// a, b, c, d, e found
for ( var prop in obj2 ) {
document.writeln( "Object2: " + prop );
}
function hasOwnProperty(obj, prop) {
var proto = obj.__proto__ || obj.constructor.prototype;
return (prop in obj) &&
(!(prop in proto) || proto[prop] !== obj[prop]);
}
if ( Object.prototype.hasOwnProperty ) {
var hasOwnProperty = function(obj, prop) {
return obj.hasOwnProperty(prop);
}
}
// a, b, c found in modern browsers
// b, c found in Safari 2.0.1 and older
for ( var prop in obj2 ) {
if ( hasOwnProperty(obj2, prop) ) {
document.writeln( "Object2 w/ hasOwn: " + prop );
}
}
上記は、 に対する機能的なクロスブラウザのソリューションですがhasOwnProperty()
、1 つの注意点があります。プロトタイプとインスタンスに同一のプロパティがある場合を区別できず、プロトタイプからのものであると想定するだけです。状況に応じて、より緩やかにしたり、より厳密にしたりすることができますが、少なくともこれはより役立つはずです。