2011-01-10 52 views
1

就性能和内存使用情况而言,重用不同数据类型的变量是否可行?Javascript变量重用?

旧数据会发生什么,是否在类型转换后立即收集垃圾?

+0

你能举一个你的意思吗? – 2011-01-10 21:53:04

+0

@JW var a = 1; a = {z:'1'} – Ozgur 2011-01-10 21:55:11

回答

2

完全披露:我不知道任何特定的JavaScript引擎的内部。我从虚拟机和口译员的一般原则出发。

通常,变量名称只是指其他内存位置。因此,无论您是否删除旧变量(在超出范围时都会发生这种情况)并引入新变量,或者用新对象替换当前内容,在内存分配方面无关紧要。

垃圾收集在每个实现中可能会有所不同。即时垃圾收集很困难;我认为这样做的唯一方法就是引用计数器,即使对于循环数据结构,也很难做到这一点。因此,野外大多数垃圾收集器都会进行非即时收集循环,每次都会删除大量数据。例如,当内存使用量超过引擎内的某个阈值时,循环可能会自动运行(但通常会比这更精确)。

3

重复使用变量是可以的,尽管除非你用一些你所使用的变量做一些疯狂的事情(在问题中这么说),否则你可能不应该以这种方式过于宽松地重用它们。一般来说,认为良好的编码习惯是将变量声明为指向特定的事物,并且当您想要引用其他变量时使用不同的变量。

Javascript中的“变量”只是参考。它们本身并不昂贵 - 它们不占用比代码中的文本更多的空间,并且内存中的几个字节指向其他地方。如果通过将引用设置为其他内容(或空值/未定义)来重用变量名称,则GC将知道该原始引用已分离并知道可以收集该引用。

无论您使用何种浏览器或环境,GC都会根据许多因素选择实际运行收集器的时间。

2

JavaScript是一种松散类型的语言,可以将任何数据类型存储在任何变量(甚至是重用的)中。

但是,如果您要组合类型,则应该使用typeof关键字定期检查它们以确保它们是您认为它们的类型(例如,试图对字符串执行数学运算将会连接或断开,具体取决于关于情况)。

此外,只要JavaScript变量在范围内,它们就会一直存在。一旦范围被留下,其中的变量就会被销毁(最终 - 它是自动的和透明的)。至于重新分配的变量上的垃圾回收,只要新值被分配,旧值就会被销毁。