JavaScript:推送到空数组中的意外行为

javascript: unexpected behavior pushing into empty array

本文关键字:意外 数组 JavaScript      更新时间:2023-09-26

以下代码:

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

因为,根据文档,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 ] }