オブジェクトのプロパティ判定
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
になっています。
以上です。
コメントを書く