JSON 文字列を解析した結果である標準オブジェクトをチェックしても、.hasOwnProperty
明らかな利点がない場合。もちろん、あなたまたはあなたが使用しているいくつかのライブラリがObject.prototype
.
一般に、undefined
そのようなものは再定義できますが、私はこれに遭遇したことはありません。また、今後もそうなるとは思いません。ただし、の戻り値を台無しにすることは(私の知る限り)不可能ですtypeof
。そういう意味では後者が無難です。undefined
古いブラウザーの中には、このキーワードでもうまく機能しないものがあると思います。
typeof
再開する場合: すべてのチェックを取り替える必要はありません。個人的な注意点として、 を使用する習慣を身につけるのは良い習慣だと思い.hasOwnProperty
ます。したがって、プロパティが存在する可能性があるが未定義の場合.hasOwnPorperty
は、最も安全な方法であることをお勧めします。
あなたのコメントへの回答: はい、typeof
~95% の確率であなたのニーズに適合します。.hasOwnProperty
99% の時間で動作します。ただし、名前が示すように、継承チェーンの上位にあるプロパティはチェックされません。次の例を検討してください。
Child.prototype = new Parent();
Child.prototype.constructor=Child;//otherwise instance.constructor points to parent
function Parent()
{
this.foo = 'bar';
}
function Child()
{
this.bar = 'baz';
}
var kiddo = new Child();
if (kiddo.hasOwnProperty('foo'))
{
console.log('This code won\'t be executed');
}
if (typeof kiddo.foo !== 'undefined')
{
console.log('This will, foo is a property of Parent');
}
したがって、単一のオブジェクトにプロパティがhasOwnProperty
あるかどうかを確認したい場合は、それが必要です。特に、そのプロパティの値を変更する場合 (プロトタイプ プロパティの場合は、すべてのインスタンスを変更できます)。継承チェーンのどこにあるかに関係なく
、プロパティに値があるかどうか ( 以外) を知りたい場合は、 が必要です。プロパティが継承チェーンのどこにあるかを判断するための再帰関数がどこかにあります。こちらも見つけ次第掲載させていただきます。undefined
typeof
アップデート:
お約束どおり、継承チェーン内のプロパティを検索する関数。しばらく前に使用した実際の機能ではないので、ワーキング ドラフトをまとめました。完璧ではありませんが、途中で役立つ可能性があります。
function locateProperty(obj,prop,recursion)
{
recursion = recursion || false;
var current = obj.constructor.toString().match(/function\s+(.+?)\s*\(/m)[1];
if (!(obj.hasOwnProperty(prop)))
{
if (current === 'Function' || recursion === current)
{
return false;
}
return locateProperty(new window[current](),prop,current);
}
return current;
}
//using the object kiddo
locateProperty(kiddo,'foo');//returns 'Parent'
locateProperty(kiddo,'bar');//returns 'Parent', too
この最後の不具合を回避するには、最後のreturn current;
ステートメントをreturn obj;
. または、さらに良いのは、上記のスニペットに次の行を追加することです。
Child.prototype.constructor=Child;
最初の編集で忘れてた…