为什么JSONObject.length未定义?

use*_*420 11 javascript json

在下面的代码中,JSONObject.length是2:

var JSONObject = [{
    "name": "John Johnson",
    "street": "Oslo West 16",
    "age": 33,
    "phone": "555 1234567"
}, {
    "name": "John Johnson",
    "street": "Oslo West 16",
    "age": 33,
    "phone": "555 1234567"
}];
Run Code Online (Sandbox Code Playgroud)

但是,在下面的代码中,JSONObject.length未定义.为什么?

var JSONObject = {
    "name": "John Johnson",
    "street": "Oslo West 16",
    "age": 33,
    "phone": "555 1234567"
};
Run Code Online (Sandbox Code Playgroud)

Dou*_*oug 17

JavaScript没有对象的.length属性.如果要完成它,则必须手动迭代该对象.

function objLength(obj){
  var i=0;
  for (var x in obj){
    if(obj.hasOwnProperty(x)){
      i++;
    }
  } 
  return i;
}


alert(objLength(JSONObject)); //returns 4
Run Code Online (Sandbox Code Playgroud)

编辑:

Javascript已经开始了,因为这是最初写的,IE8是不相关的,你应该感到安全使用Object.keys(JSONObject).length.更清洁.

  • 这将只返回_directly_对象的_enumerable_属性的长度(不包括原型链上的可枚举).顺便说一句,这可以写成(在现代JS中)作为`Ob​​ject.keys(obj).length`. (2认同)

Amo*_*rni 5

以下实际上是JSON对象的数组:

var JSONObject = [{ "name":"John Johnson", "street":"Oslo West 16", "age":33,
"phone":"555 1234567"}, {"name":"John Johnson", "street":"Oslo West 16", 
"age":33, "phone":"555 1234567" }];
Run Code Online (Sandbox Code Playgroud)

因此,在JavaScript中length是数组的属性。在第二种情况下

var JSONObject = {"name":"John Johnson", "street":"Oslo West 16", "age":33, 
"phone":"555 1234567"};
Run Code Online (Sandbox Code Playgroud)

JSON对象不是数组。因此length属性不可用,并且将是未定义的。因此,您可以将其设置为数组,如下所示:

var JSONObject = [{"name":"John Johnson", "street":"Oslo West 16", "age":33, 
"phone":"555 1234567"}];
Run Code Online (Sandbox Code Playgroud)

或者,如果您已经有反对意见JSONObject。您可以尝试以下操作:

var JSONObject = {"name":"John Johnson", "street":"Oslo West 16", "age":33, 
"phone":"555 1234567"};
var jsonObjArray = []; // = new Array();
jsonObjArray.push(JSONObject);
Run Code Online (Sandbox Code Playgroud)

而且您确实length拥有财产。