正确重置javascript中的全局变量?

时间:2013-04-24 22:45:05

标签: javascript arrays variables scope

所以,在 this post here 中,人们正在讨论这样一个事实

A = [1,2,3];

然后做

A = [];

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

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

myglobals = { A : [] }

我可以使用

安全地重置阵列吗?
myglobals.A = [];

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

由于下面的评论而更新问题

由于普遍认为splice(0)是可行的方法,并且由于一个非常相似的问题有一个答案可以解释对浏览器释放内存的影响,我想知道它是否通常是安全的将任何已定义的对象(无论是数组,函数还是字符串等)设置为null,以便重置,同时保留引用?< / p>

5 个答案:

答案 0 :(得分:5)

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

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

在你的对象属性的例子中,它是一样的。 JavaScript中没有指针,只是引用值。因此myglobals.A的值是对数组的引用。为其分配新数组时,该值将成为另一个数组的新引用。

答案 1 :(得分:2)

不,这仍然会创建一个新数组。重要的因素是赋值,而不是附加“A”变量的范围。只要您执行类似something = []的操作,JavaScript引擎就会制作一个新的Array对象([]部分),然后将其引用分配给something

答案 2 :(得分: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.

答案 3 :(得分:1)

var A=[1,2,3];
A=undefined;
console.log(A); //undefined

答案 4 :(得分:1)

var handle={};
handle.A=[1,2,3,4,5,{x:2,y:3}];
console.log(handle);

what is given now

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

after deleting A from handle

为什么删除时间更好?它真的会从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的东西,你可以通过它来防止循环通过现有元素。同样适用于设置为undefined,低于...

so be carefull