2

所以,在这篇文章中,人们正在讨论这样一个事实

A = [1,2,3];

然后做

A = [];

不会重置阵列,而是创建一个新阵列。

我的问题是,如果我使用全局对象变量

myglobals = { A : [] }

我可以安全地重置阵列吗

myglobals.A = [];

正确的?因为它引用了相同的对象属性,因此我实际上并没有创建一个新数组,是吗?

由于以下评论而更新问题

由于有一个普遍的共识splice(0)是要走的路,并且由于一个非常相似的问题有一个解释对浏览器释放内存的影响的答案,我想知道设置任何定义的对象是否通常是安全和适当的(无论是数组或函数或字符串等...)null以重置它的,同时保留它的参考

4

5 回答 5

6

您正在创建一个新数组。如果要截断数组,只需将其长度设置为零:

var a = [1,2,3];
a.length = 0;
// a is now []

在您的带有对象属性的示例中,它是一样的。JavaScript 中没有指针,只有引用值。所以 的值myglobals.A是对数组的引用。当您为其分配一个新数组时,该值将成为另一个数组的新引用。

于 2013-04-24T22:50:16.937 回答
2

并不真地...

// make a global variable
var a = [1,2,3];

// Assign it to something
var someObj = { value: a };
someObj.value; // [1,2,3];

// set a new value for the global
a = [];
a; // []
someObj.value; // [1,2,3];

这是您提到的初始代码。您可以更改全局变量指向的对象,但不能更改对要替换的对象的其他引用。

你的第二个例子也存在同样的问题:

// make a global variable
var globals = { a: [1,2,3] };

// Assign it to something
var someObj = { value: globals.a };
someObj.value; // [1,2,3];

// set a new value for the global
globals.a = [];
globals.a; // []
someObj.value; // [1,2,3];

globals如果要更新引用,则必须引用容器对象。那是其他对象持有对容器的引用,然后您可以更改该容器的内容。

// make a global variable
var globals = { a: [1,2,3] };

// assign a reference to the container in another object.
var someObj = { globals: globals };
someObj.globals.a; // [1,2,3];

// set a new value for the global
globals.a = [];
globals.a; // []
someObj.globals.a; // [];

认为这可能会有点笨拙。


您还可以通过全局更改对象引用,而不是替换它。

var a = [1,2,3];
var b = a; // a and b now reference the same object.

a.splice(0); // remove all items from this array, without replace the array object.
a; // [];
b; // [];
// a and b now still point to the same array, which is now empty.
于 2013-04-24T22:54:21.573 回答
2

不,这仍然会创建一个新数组。重要的因素是赋值,而不是“A”变量所附加的范围。只要你做一些看起来像something = []的事情,JavaScript 引擎就会制造一个新的 Array 对象([]部件),然后将它的引用分配给something.

于 2013-04-24T22:50:14.650 回答
1
var handle={};
handle.A=[1,2,3,4,5,{x:2,y:3}];
console.log(handle);

现在给出了什么

delete handle.A;
console.log(handle); //A is gone!

从句柄中删除 A 后

为什么有时删除更好?它真的很致命A,如果您希望告诉您真相handle,以下可能会使您在处理更大的物体时感到困惑。.length

handle.A=[null];
handle.B=undefined;
handle.C=null;
handle.A.length=10;
console.log(handle, handle.length, handle.A.length);

不是很节省编码,因为我设置了它=10,你的脚本可能会假设错误,有一些东西要循环通过 10 个元素。所以handle.A=null会有所帮助,但不会真正改变对象的结构。但它也不能破坏你的脚本,因为你有类似的东西var A,你可以防止循环通过不存在的元素。同样适用于 set to undefined, se 下面..

所以要小心

于 2013-04-25T02:23:40.763 回答
1
var A=[1,2,3];
A=undefined;
console.log(A); //undefined
于 2013-04-24T23:29:32.500 回答