在性能和内存使用方面重用不同数据类型的变量是否可以?
旧数据会发生什么,是否在类型转换后立即收集垃圾?
答案 0 :(得分:3)
重用变量是可以的,虽然除非你在使用你使用的变量数量做一些疯狂的事情(在问题中这么说),否则你可能不应该以这种方式过于宽松地重用它们。一般认为将变量声明为指向特定事物,并在想要引用其他内容时使用不同的变量,这被认为是良好的编码实践。
Javascript中的“变量”只是引用。它们本身并不昂贵 - 它们不占用比代码中的文本更多的空间以及内存中指向其他地方的几个字节。如果通过将引用设置为其他东西(或null / undefined)来重用变量名,那么GC将知道原始引用已分离并且知道它可以被收集。在您使用的任何浏览器或环境中,GC将根据许多因素选择何时实际运行收集器。
答案 1 :(得分:2)
完全披露:我不了解任何特定JavaScript引擎的内部。我将从虚拟机和口译员的一般原则出发。
通常,变量名称仅指其他内存位置。因此,无论是删除旧变量(当它超出范围时发生)并引入新变量,还是用新对象替换当前内容,在内存分配方面都无关紧要。
每个实现中的垃圾收集可能不同。立即进行垃圾收集很困难;我能想到的唯一方法就是参考计数器,即使对于循环数据结构也很难做到这一点。因此,大多数垃圾收集器都会进行非立即收集周期,每次都会删除一大堆数据。例如,当内存使用超过引擎内的某个阈值时,循环可能会自动运行(但通常会比这更精确)。
答案 2 :(得分:2)
JavaScript是一种松散类型的语言,可以在任何变量中存储任何数据类型(甚至是重用的)。
但是,如果要组合类型,则应使用typeof关键字定期检查它们,以确保它们是您认为的类型(例如,尝试对字符串执行数学运算将连接或断开,具体取决于情况)。
此外,只要JavaScript变量在范围内,它们就会存在。一旦留下范围,其中的变量将被销毁(最终 - 它是自动且透明的)。对于重新分配的变量上的垃圾收集,只要分配了新值,旧值就会被销毁。