为什么数组上的. tostring给出一个奇怪的结果

Why .toString on an array gives a strange result?

本文关键字:一个 结果 数组 tostring 为什么      更新时间:2023-09-26

我知道这个问题反映了我未能完全理解JS中对象和数组之间的差异,以及何时最好使用两者。我正在寻找理解为什么下面的函数的输出是如此疯狂,并希望这将帮助我理解Objs和数组在JS中的一些细微之处。

//orders is an array of numbers
function myFunction(orders, callback){  
 var sold = []; //fixed by changing to an obj
 var open = []; //fixed by changing to an obj
 var reply = [];
 var response = function(sold, open){ 
     reply.push({Output: {sold:sold, open:open}});
     callback(reply);
  };
  orders.forEach(function(id, i){
    //somelogic that builds sold and open
    if(i == orders.length -1) response(sold, open);
  });
 }

在本例中,sold和open都是键值数组。response的输出是我所期望的:

[ { Output: { sold: [Object], open: [Object] } } ]

然而,如果我只是稍微修改这一点,通过添加一个.toString()到任何一个数组,我得到波浪的大量输出,最终导致我不得不硬杀死进程。解决方案是显而易见的,我需要传递对象而不是数组,并使用JSON.strigify()。我的问题是,为什么这些结果会有如此大的不同?意外输出是使用键值数组的.push的结果吗?我已经成功地使用了键值对数组,但是我是否应该将reply更改为对象并删除推送方法?

重要的是要理解Javascript中的"键值数组"根据定义意味着您正在谈论对象。因为对象是键值,数组是索引值。

你的代码有点难读,因为我不知道你给出了什么输入,也不知道你期望得到什么输出。但是如果我理解正确的话,您希望返回一个具有两个属性的对象:soldopen,因此您可以将其称为reply.soldreply.open。这意味着reply应该是一个对象,有两个键:"sold"answers"open"。这两个键的两个值都将是一个包含订单的数组。这些不需要是对象,因为不需要键。

实际上可以在一行中定义对象reply,以及两个数组reply.soldreply.open:

var reply = { sold: [], open: [] }

这意味着你的响应函数看起来像这样:

var response = function(sold, open){ 
    reply.sold.push(sold);
    reply.open.push(open);
    callback(reply);
};

最后这将是reply的结构:

{
    sold: [ order1, order2, order3, ... ],
    open: [ orderA, orderB, orderC, ... ]
}

由于reply.soldreply.open现在是数组,您可以简单地使用.join(glue)将它们转换为更可读的字符串:

var soldString = reply.sold.join(", ") // "order1, order2, order3, ..."
var openString = reply.open.join(", ") // "orderA, orderB, orderC, ..."

在这种情况下使用数组的另一个有用的地方是,您可以实际地给顺序一个特定的顺序(没有双关语的意思)。对于对象,大多数Javascript引擎在执行"for in"循环时将按字母顺序遍历属性。然而,这并不能保证。但是当在数组上调用.forEach()时,或者在执行常规的for循环时。

//  assuming object "obj", and array "arr"
for(var key in obj) { /* order of "key" is not guarantied */ }
for(var i = 0; i < arr.length - 1; i ++) { /* "i" is always in ascending order */ }