2

非常简单的例子:

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;
}
4

2 回答 2

4

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

每次你用一个值实例化一个变量时,说一个像{ id: 10 }. 该对象存储在内存中,并且引用返回给您的变量,假设您命名它a

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

你现在不想再保留这个变量b,所以你写了b = null;。您认为该对象已被删除,但 Javascript 运行时知道该对象{ id: 10 }一个引用——即变量a——引用它。所以它不会{ id: 10 }从内存中删除。

然而,如果你也写了a = null;,那么有零引用,并且 Javascript 运行时的垃圾收集器最终会从内存中删除对象。

所有这些都是为了让您了解,如果没有进一步的整理,您将无法实现您希望做的事情。

如果你真的想a, b, c成为null,你将不得不编写一些代码来明确设置它们的值null。就像a = arr[0]; b = arr[1]; c = arr[2];每当数组改变时一样。您可以eval使用语句并进行一些字符串模板化以不手动编写变量等,并从中进行循环,但是如果您只有三个变量,那是不值得的。

希望这可以帮助。

于 2013-09-13T09:36:02.990 回答
2

JavaScript 没有指针,因此以原始方式实现您想要的内容是行不通的。

除了arr[0] = null,您也可以尝试直接设置anull

于 2013-09-13T09:14:05.200 回答