質問: { k: 1 }; Object.getOwnPropertyNames(obj); //["k"] ```
回答: 最近JavaScript関連の規格の進歩には必ずしもついていけていないので、改めて調べてみたのですが、lengthを「Objectの組み込みプロパティ」とする記述は見つけられませんでした。いくつかの記述から判断すると、**「Objectのコンストラクタのlength」と「Objectのlength」を混同**されているように思われます。 ***Objectの組込みプロパティlengthはなぜ、obj.length;で使用できないのでしょうか?*** Objectには組み込みプロパティとしてのlengthはないわけですから、当然obj.lengthは一般的には未定義です。Objectのコンストラクタのlengthプロパティは、当然`Object.length`で参照できてその値は1のはずです。 ***Object.keysで取得できるということは、組込みプロパティlengthは列挙不可に設定されているのでしょうか?*** Object.keysはオブジェクトを連想配列として使用する場合のキーの配列(Array)を返します。Arrayにはlengthが定義されていますから、`Object.keys(obj).length`はArrayのlengthプロパティを参照しており、Objectのlengthプロパティが「列挙不可」かどうかとは直接の関係はありません。Arrayのlengthプロパティは列挙不可ではあります。 ***in演算子で確認できると思ったのですが*** 何度も述べていますが、Object一般にはlengthプロパティは必ずしも存在しませんから、in演算子で調べてもlengthプロパティの存在は確認できません。Objectのコンストラクにはlengthプロパティが存在するので、`'length' in Object`は`true`を返すはずです。 ***組込みプロパティlengthは、どこに所属しているのでしょうか?*** Array, String, Functionなどに定義されています。JavaScriptのコンストラクタはFunctionの一種なので、「Objectのコンストラクタのlength」もFunctionのlengthと同じものです。