访问对象并将其设置为数组的null throw元素

时间:2013-09-13 09:09:33

标签: javascript jquery

很简单的例子:

var a = { id: 5 };
var b = { id: 6 };
var c = { id: 7 };
var arr = [a, b, c];

现在我有一个功能:

function remove(startIndex) {
  // set objects to null from startIndex in array
}

如果我试试这个:

arr[0] = null;

然后我有:

arr[0] == null // true
a == null // false (i need true)

所以,我的问题是,如何访问对象抛出任何集合(数组或对象)并更改它?

我不想写这样的东西:

function remove(startIndex) {
  if(startIndex == 0) { 
    a = null;
    b = null;
    c = null;
  }
  if(startIndex == 1) {
    b = null;
    c = null;
  }
  if(startIndex == 2) {
    c = null;
  }
}

这样写起来容易得多(但它不起作用):

function remove(startIndex) {
  for(var i = startIndex; i<arr.length; i++) arr[i] = null;
}

2 个答案:

答案 0 :(得分:4)

我不知道你正在编写的这段代码到底是什么,但这里是Javascript的工作原理:

每次使用值实例化变量时,请说出像{ id: 10 }这样的对象。该对象存储在内存中,引用将返回到您的变量,比如您将其命名为a

现在,如果您说var b = a;,现在将相同的引用传递给变量b。现在Javascript运行时知道你有两个引用对象{ id: 10 }的变量。

您现在不再希望保留变量b,因此您需要编写b = null;。您认为该对象已被删除,但Javascript运行时知道对象{ id: 10 }具有一个引用 - 即变量a - 引用它。因此它不会从内存中删除{ id: 10 }

但是,如果你也写a = null;,那么有 Zero 引用,Javascript运行时的Garbage Collector最终会从内存中删除对象。

所有这一切都是为了让你明白,如果没有进一步的内务管理,你将无法达到你希望的目标。

如果您真的希望a, b, cnull,则必须编写一些明确将其值设置为null的代码。与数组更改时的a = arr[0]; b = arr[1]; c = arr[2];类似。你可以eval语句并做一些字符串模板,不用手写等变量,然后从中做出一个循环,但如果你只有三个变量那就不值得。

希望这有帮助。

答案 1 :(得分:2)

JavaScript没有指针,所以以原始方式实现你想要的东西是行不通的。

除了arr[0] = null之外,您也可以尝试直接将a设置为null