【问题标题】:What kind of object is this in javascript?在 javascript 中这是什么类型的对象?
【发布时间】:2018-07-19 09:44:25
【问题描述】:

我有一个对象'obj'。假设我们暂时不知道它来自哪里。

如果我这样做

console.log(JSON.stringify(obj));

我得到

[{"foo":101,"bar":1,"foobar":0},{"foo":102,"bar":1,"foobar":0}]

这是什么东西?

我要求我看到两种我无法理解的行为:

1)它似乎是一个对象数组(?)所以我希望

console.log(obj[0])

返回:

{"foo":101,"bar":1,"foobar":0},{"foo":102,"bar":1,"foobar":0}

而是返回:

{"foo":101,"bar":1,"foobar":0}

2) 我希望

for (var somevar in obj){ 
   console.log(JSON.stringify(somevar));
}

返回

first step: {"foo":101,"bar":1,"foobar":0}
second step: {"foo":102,"bar":1,"foobar":0}

而是返回

first step: "0"
second step: "1"

谁能解释一下这个对象的性质以及为什么这两种情况(尤其是第二种情况)会返回这样的结果?

【问题讨论】:

  • 这是一个对象数组。我不明白为什么您会在第一种情况下期望输出。
  • 您似乎不了解数组的工作原理,也不了解 for..in 的工作原理......
  • 你可以在这里使用for..of。它会给你元素而不是索引。
  • 你为什么期望console.log(obj[0])返回{"foo":101,"bar":1,"foobar":0},{"foo":102,"bar":1,"foobar":0}...?
  • @SashaGrievus:因为错字。多加注意并安装/配置拼写检查器

标签: javascript object


【解决方案1】:

obj 是数组或对象。它在索引01 处有两个对象,这就是为什么当您执行console.log(obj[0]); 时它只给您{"foo":101,"bar":1,"foobar":0}。哪个是索引0 处的对象。

对于第二个问题,for (var somevar in obj) 循环遍历 obj 的每个键,并且由于它是数组数据类型,因此数组的键始终是其 index 值。这就是你在控制台中得到01 的原因。要完成这项工作,您需要在for 中执行var somevar of obj,然后将考虑value 而不是obj 数组中的key

var obj = [{"foo":101,"bar":1,"foobar":0},{"foo":102,"bar":1,"foobar":0}];

for (var somevar of obj){ 
   console.log(JSON.stringify(somevar));
}

【讨论】:

  • 您可以添加,以获取数组 1 中的对象应该在循环中使用 of 而不是 in
  • 如果它是一个简单的对象数组,为什么编译器会抱怨“类型{}中不存在属性长度”?我做的第一件事是尝试将它作为一个数组循环,但它似乎没有“长度”,那么我该如何循环?
  • @SashaGrievus:“所以我是如何循环的” - 你可以从正确拼写 length 开始。
  • @SashaGrievus 检查更新的答案。你仍然可以使用var somevar of obj 而不是in
  • @Ankit Agarwal 非常感谢,我明白了。关于长度的错误仍然很奇怪。如果我使用“of”而不是“in”,编译器会说“类型'{}'不是矩阵类型或字符串:D
【解决方案2】:

对于您特定的第一个问题 - 当我们通过索引访问数组时,它会返回该特定索引的值。例如

var first_array = ['A', 'B', 'C', 'D'];
var secound_array = [{"foo":101,"bar":1,"foobar":0},{"foo":102,"bar":1,"foobar":0}];

使用索引访问数组数据的语法是array_variable[index],其中索引是数值。例如

first_array[0] // output = A
first_array[2] //output = C
secound_array[0] // output = {"foo":101,"bar":1,"foobar":0}

这是您的第一个问题解决方案,因为您正在通过数组索引访问元素。数组的索引从 0 开始。 对于您的第二个问题for..in 语句使用索引而不是值进行迭代。如果我写如下代码 -

for (var somevar in secound_array){ 
   console.log(JSON.stringify(somevar));
}

输出是

first step: 0
second step: 1

如果你想要像

这样的输出
first step: {"foo":101,"bar":1,"foobar":0}
second step: {"foo":102,"bar":1,"foobar":0}

您需要编写如下代码 -

for (var somevar of secound_array){ 
   console.log(JSON.stringify(secound_array[somevar])); // here somevar is index of the item
}

更多信息click here 您也可以查看for...of。例如

for (let o of secound_array) {
    console.log(o)
}

【讨论】:

    【解决方案3】:

    第一个问题:

    您的数组中有两个元素:

    var obj = 
    [
        {"foo": 101, "bar":1, "foobar": 0}, //first element at index 0
        {"foo": 102, "bar":1, "foobar": 0}  //second element at index 1
    ];
    
    console.log(obj[0]);

    如果你写console.log(obj[0]);,那么你会同时得到第一个元素而不是2个元素,因为在索引0你只有一个元素。 这是正确的。

    关于第二个问题:

    var obj = [{"foo": 101, "bar":1, "foobar": 0},{"foo": 102, "bar":1, "foobar": 0}];
    
    for (var somevar in obj){ 
        console.log(JSON.stringify(somevar));
    }

    这个放在控制台里:

    第一步:“0”

    在第二步:“1”

    这也是正确的。 根据您的意愿,您必须使用for of 循环而不是for in,因为for in 为您提供元素的索引,而不是像@987654328 这样的元素@。

    检查for infor of之间的区别:

    var arr = [ 3, 5, 7 ];
    
    for(var i in arr) {
        console.log(i); // 0, 1, 2
    }
    
    console.log('-----');
    
    for(var i of arr) {
        console.log(i); // 3, 5, 7
    }

    【讨论】:

    • 谢谢你,你是对的。但就我而言,编译器会返回该错误。如果没有对情况的全面了解,可能根本不可能调试它,但不可能解释或摆弄所有东西。数据由返回查询结果的 node.js Web 服务返回,然后由 ionic 3 应用程序获取响应,用 JSON.parse 解析,这就是问题开始的时候。还是非常感谢你
    • @SergioTulentsev,这是用主题启动语言编写的。 ;-)
    • @Bharata 感谢您提供有关 for in 和 for of 的示例。理解这一点对我来说真的很有价值:)
    • @SergioTulentsev,好的,你是对的!我为你和世界和平改变了它! ;-)
    • @SashaGrievus,根据网站规则回答您的问题后,您无法更改问题中的语言。可能是你的这个新代码有一些错误。但在这种情况下,您必须提出一个新问题,因为我正确回答了您的问题。如果您对我的回答感到满意,请在我的回答左侧将其标记为已接受,然后在新帖子中写一个新问题。
    【解决方案4】:

    数组是 JavaScript 中的对象。所以这种行为是完全可以预料的。索引是数组的键。 所以当你这样做时 console.log(obj[0]) 您只需访问数组中的第一项 然后在第二种情况下,您只需注销字符串化键 '0' 和 '1'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      相关资源
      最近更新 更多