JavaScript:向空数组中添加元素出现意外行为

5
以下是代码:

var arr1 = [1,2,3];
var obj1 = {};

for (var j = 0; j < arr1.length; j++) {
    if (obj1[j.toString()])
        obj1[j.toString()] = obj1[j.toString()].push(j)
    else
        obj1[j.toString()] = [].push(j);
}

产生了以下输出:
   obj1
=> { '0': 1, '1': 1, '2': 1 }

我希望你能够友善地告诉我原因。

(我现在意识到以下代码:

var arr1 = [1,2,3];
var obj1 = {};

for (var j = 0; j < arr1.length; j++) {
    if (obj1[j.toString()])
        obj1[j.toString()] = obj1[j.toString()].push(j)
    else {
        obj1[j.toString()] = [];
        obj1[j.toString()].push(j);
    }
}

将给我所需的输出:
   obj1
=> { '0': [ 0 ], '1': [ 1 ], '2': [ 2 ] }

)


2
嗯,[]Array.prototype相同,没有空数组,并且您没有将任何内容推入obj内。第二个代码片段是正确的方法,您实际上创建了一个空数组。 - adeneo
1个回答

11

根据文档,Array.prototype.push() 方法返回的是数组长度而不是数组本身。你可以使用 concat 方法,例如:

var arr1 = [1,2,3];
var obj2 = {}

for (var j = 0; j < arr1.length; j++) {
  var js = j.toString()
  if (obj2[js]) {
    obj2[js] = obj2[js].concat([j])
  } else {
    obj2[js] = [j]
  }
}
console.log(obj2) // => { '0': [ 0 ], '1': [ 1 ], '2': [ 2 ] }

// shorter version
var obj3 = {}

for (var j = 0; j < arr1.length; j++) {
  var js = j.toString()
  obj3[js] = [].concat(obj3[js] || [], [j])
}

console.log(obj3) // => { '0': [ 0 ], '1': [ 1 ], '2': [ 2 ] }

没有注意到第一个片段。+1 - Rajaprabhu Aravindasamy
已确认。 [1,2,3].push(60); // 4; [].push(90); // 1; 谢谢。 - anatta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接