機能する理由:
これは、for... in
ループを使用してオブジェクトのプロパティを反復処理します。
オブジェクトにプロパティがある場合、ループに入って戻りますfalse
オブジェクトにプロパティがない場合、ループに入らず、 を返しtrue
ます。
できない理由:
動作しない場合がありますのでご注意ください。for.. in
ループはプロパティのみを通過enumerable
するため、技術的にはオブジェクトが空でなくても false が返されます。プロパティを列挙できないように定義して、このメソッドをだますことができます。これが問題のケースです。
正しいことは、このメソッドは、オブジェクトに列挙可能なプロパティがあるかどうかをチェックするということです。
ドキュメントの内容:
メソッドのドキュメントはこちらにあります。
説明: オブジェクトが空 (列挙可能なプロパティを含まない) かどうかを確認します。
個人的には、彼らがそのメソッドを呼び出すのは奇妙だと思いますisEmptyObject
。の方がふさわしい名前だと思いますhasNoEnumerableProperties
。
オブジェクトが空かどうかを本当に確認したい場合はどうすればよいでしょうか?
JS の新しい実装では、Object.getOwnPropertyNames
. getOwnPropertyNames
列挙可能かどうかに関係なく、すべてのプロパティを取得します。
isMyObjEmpty
で実装できますObject.getOwnPropertyNames(myObject).length===0
。これにより、列挙可能かどうかに関係なく、オブジェクトにプロパティがないことが確認されます。
ただし、これはプロトタイプのプロパティをチェックしません。これは望ましい動作かもしれませんし、望ましくないかもしれません。それについてのシャドウモンキーとの議論を確認してください。Object.getPrototypeOf
これは、再帰的に呼び出しを行い、プロトタイプチェーン全体でプロパティをチェックすることで簡単に解決できます。