delete doesn't delete the object, it deletes the property that was referencing the object. In your move function, since you've just assigned that object to another property, you still have the object. (Whatever was previously in that slot in the array is toast, though.)
Your example above mostly works, here's an example (using a custom object so we can easily print out the contents of the arrays):
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
I wouldn't recommend delete in this scenario, though, since it's very unlikely it's what you actually want. If you want to keep the "cell" but remove its contents, just assign undefined to it. delete actually removes it.
Somewhat off-topic, but: JavaScript doesn't have multi-dimensional arrays. What you have there is an array of arrays. It's a distinction that does actually have a difference, in that the arrays held by the outermost array can be of different lengths. (Also, JavaScript arrays are sparse — they're not really arrays at all, barring an implementation choosing to make them so — so the arrays could have the same length but gaps.)