javascript:推入空数组的意外行为

javascript: unexpected behavior pushing into empty array

以下代码:

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 ] }

)

因为,as per the documentationArray.prototype.push()方法returns数组长度,而不是数组本身。

您可能更喜欢这样的 concat method

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 ] }