1. ホーム
  2. javascript

[解決済み] JavaScript でオブジェクトが特定のプロパティを持つかどうかを確認するにはどうすればよいですか?

2022-03-14 13:37:15

質問

JavaScript でオブジェクトが特定のプロパティを持っているかどうかを確認するにはどうすればよいですか?

を考えてみましょう。

x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
    //Do this
}

それがベストな方法なのでしょうか?

どのように解決するのですか?

回答が多く、そのほとんどが不正解で困っています。もちろん、未定義、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 同じプロパティがプロトタイプにある場合とインスタンスにある場合を区別することができず、単にプロトタイプにあるものとみなしてしまうのです。あなたの状況に応じて、より甘くしたり厳しくしたりすることができますが、少なくともこれはより有用なはずです。