Javascript引用数组

时间:2010-09-25 13:15:14

标签: javascript reference

我有一个大的多维数组,它包含对象的引用,我需要能够将引用从数组中的一个点移动到另一个点,然后删除原始引用(或将其设置为undefined)。这样做的问题是它会删除最近的引用。

var data = [[new Obj, new Obj], [new Obj, new Obj]];

function move(fromx, fromy, tox, toy) {
   data[tox][toy] = data[fromx][fromy];
   delete data[fromx][fromy];
}

编辑:我的意思是两个都不见了。 data[tox][toy] === undefined;两个引用都被销毁,而不仅仅是data[fromx][fromy]

3 个答案:

答案 0 :(得分:1)

是的,这只是delete运算符执行它应该执行的操作,即删除[fromx,fromy]中引用的对象。尝试简单地将data[fromx][fromy]设置为null或未定义的变量(例如allYourBaseBelongToUs(至少我希望它未定义)或者如果您无聊undefined也未定义。

来源:

  1. https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special_Operators/delete_Operator
  2. http://www.openjs.com/articles/delete.php

答案 1 :(得分:0)

var x = [[{'a':'1'}, {'b':'1'}], [{'c':'1'}, {'d':'1'}]]
x[1][0] = x[0][0]
x[1][1] = x[0][1]
delete x[0][0]
delete x[0][1]

console.log(x)

打印[[undefined, undefined], [Object { a="1"}, Object { b="1"}]]

您的预期产量是多少?

答案 2 :(得分:0)

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数组稀疏 - 它们根本不是真正的数组,除非实现选择使它们如此 - 所以数组可以具有相同的长度但是间隙。)