[Javascript] オブジェクトが指定されたプロパティを保持しているかどうかの判定

[Javascript] オブジェクトが指定されたプロパティを保持しているかどうかの判定

オブジェクトのプロパティ判定

Javascriptにおいて、オブジェクトが指定されたプロパティを保持しているかどうかを判定したいことがあります。

判定するための方法として、in 演算子と hasOwnProperty 関数があるので、それぞれの使い方と違いをまとめます。

in 演算子

概要と構文

in 演算子は、指定されたプロパティが指定されたオブジェクトにある場合に true を返します。

プロトタイプチェインのプロパティについても、in 演算子は true を返します。

prop in obj
  • obj: オブジェクト
  • prop: 判定対象のプロパティ名を文字列で指定

サンプル

var obj = { a: 1, b: "xxx" }
console.log("a" in obj);        // true
console.log("x" in obj);        // false
console.log("toString" in obj); // true

var array = ["a", "b", "c"];
console.log(0 in array);        // true(インデックスで指定可能)
console.log(4 in array);        // false(範囲外)
console.log("a" in array);      // false(要素では指定不可)
console.log("length" in array); // true

hasOwnProperty

概要と構文

オブジェクトが指定されたプロパティを持っているかどうかを示す真偽値を返します。

Objectに実装されているため、子孫にあたるオブジェクトには必ず実装されています。in 演算子と違い、プロトタイプチェーンをさかのぼって存在確認を行うわけではありません。

obj.hasOwnProperty(prop)
  • obj: オブジェクト
  • prop: 判定対象のプロパティ名を文字列で指定
  • 戻り値: 指定された名前のプロパティがあれば true

サンプル

var obj = { a: 1, b: "xxx" }
console.log(obj.hasOwnProperty("a"));        // true
console.log(obj.hasOwnProperty("x"));        // false
console.log(obj.hasOwnProperty("toString")); // false

var array = ["a", "b", "c"];
console.log(array.hasOwnProperty(0));        // true
console.log(array.hasOwnProperty(4));        // false
console.log(array.hasOwnProperty("a"));      // false
console.log(array.hasOwnProperty("length")); // true

両者の違い

上述の通り、in 演算子と hasOwnProperty 関数 の違いは、プロトタイプチェーンをさかのぼってプロパティの存在確認を行うか否かにあります。それ以外は同じような処理結果になります。

サンプルコードでいうと、適当に定義したオブジェクトが toString を持つかどうかの判定で、処理結果が異なっているのが確認できます。プロトタイプチェーンをさかのぼる in 演算子だと、Object に実装されている関数を見つけるので true になりますが、指定オブジェクトに対してのみチェックする hasOwnProperty 関数では、false になっています。

以上です。

参考URL

Javascriptカテゴリの最新記事