delete 不会删除对象,它会删除引用该对象的属性。在您的 move 函数中,由于您刚刚将该对象分配给另一个属性,因此您仍然拥有该对象。 (不过,数组中该插槽中的任何内容都是 toast。)
您上面的示例大部分都有效,这是一个示例(使用自定义对象,因此我们可以轻松打印出数组的内容):
function T(id) {
this.id = id;
}
T.prototype.toString = function() {
return this.id;
};
var data = [[new T("0x0"), new T("0x1")],
[new T("1x0"), new T("1x1")]];
display("0: " + data[0].join(","));
display("1: " + data[1].join(","));
display("Moving 0x0 to 1x2");
move(0, 0, 1, 2);
display("0: " + data[0].join(","));
display("1: " + data[1].join(","));
function move(fromx, fromy, tox, toy) {
data[tox][toy] = data[fromx][fromy];
delete data[fromx][fromy];
}
function display(msg) {
var p = document.createElement('p');
p.innerHTML = msg;
document.body.appendChild(p);
}
Live copy
不过,在这种情况下,我不会推荐 delete,因为这不太可能是您真正想要的。如果您想保留“单元格”但删除其内容,只需将 undefined 分配给它。 delete 实际上删除了它。
有点跑题了,但是:JavaScript 没有多维数组。你有一个数组数组。这是一个实际上有区别的区别,因为最外面的数组持有的数组可以有不同的长度。 (此外,JavaScript 数组是稀疏的——它们根本不是真正的数组,除非实现选择使它们如此——所以数组可以具有相同的长度但有间隙。)