delete
не удаляет объект, он удаляет свойство, ссылающееся на объект. В вашей функции move
, поскольку вы только что назначили этот объект другому свойству, у вас все еще есть объект. (То, что было ранее в этом слоте в массиве тост, хотя.)
Ваш пример выше в основном работает, вот пример (с использованием пользовательского объекта таким образом, мы можем легко распечатать содержимое массивов):
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 массивы немногочисленны — они на самом деле не массивы на всех, за исключением реализацию, выбирая, чтобы сделать их настолько — поэтому массивы могут иметь одинаковую длину, но пробелы.)
Или, вы знаете ... 'undefined'. ;-) –
Я нахожу использование ссылок на культуру поп/код, так как неопределенные переменные гораздо интереснее. –