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