22061
**Objectの組込みプロパティlengthはなぜ、obj.length;で使用できないのでしょうか？**  
・常に1だから？  
・対象はユーザ定義オブジェクトではないのでしょうか？

```

    var obj = { k: 1 };
    obj.length; //undefined
    
```

* * *

**Object.keysで取得できるということは、組込みプロパティlengthは列挙不可に設定されているのでしょうか？**

```

    var obj = { k: 1 };
    Object.keys(obj).length; //1
    
```

* * *

**in演算子で確認できると思ったのですが**  
・in演算子は組込みプロパティには未対応なのでしょうか？

```

    var obj = { k: 1 };
    "length" in obj; //false
    
    
    var obj = { k: 1 };
    length in obj; //false
    
```

* * *

**組込みプロパティlengthは、どこに所属しているのでしょうか？**

```

    var obj = { k: 1 };
    obj.hasOwnProperty('length'); //false
    
    var obj = { k: 1 };
    obj.k.hasOwnProperty('length'); //false
    
    var obj = { k: 1 };
    Object.getOwnPropertyNames(obj); //["k"]
    
```
CC BY-SA 3.0
2016-02-14T02:24:33.710
22059
2016-02-14T03:29:26.860
7886
question
javascript
Objectの組込みプロパティlengthを使用する際、Object.keysを使用しなければいけない理由は？
最近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と同じものです。
CC BY-SA 3.0
2016-02-14T03:29:26.860
22061
2016-02-14T03:29:26.860
13972
22059
answer