【发布时间】:2015-03-26 17:39:37
【问题描述】:
我喜欢在比较值时不关心变量是字符串还是数字,所以我不使用 ==,而不是 ===。但是由于 == 在比较之前将两个值转换为相同的数据类型,它是否会产生垃圾并加剧游戏中那些讨厌的垃圾收集短暂的停顿?如果是这样,是否仅在将字符串与数字进行比较时,还是在将数字与数字以及字符串与字符串进行比较时?
【问题讨论】:
标签: javascript garbage-collection
我喜欢在比较值时不关心变量是字符串还是数字,所以我不使用 ==,而不是 ===。但是由于 == 在比较之前将两个值转换为相同的数据类型,它是否会产生垃圾并加剧游戏中那些讨厌的垃圾收集短暂的停顿?如果是这样,是否仅在将字符串与数字进行比较时,还是在将数字与数字以及字符串与字符串进行比较时?
【问题讨论】:
标签: javascript garbage-collection
是的,== 可以创建垃圾,因为它可能会在执行类型强制时调用对象上的 .toString() 或 .valueOf() 方法;并且这些方法可能会造成严重破坏(它们可以是用户定义的)。
但是不,== 在比较(原始)字符串和(原始)数字时不会产生垃圾,进程中分配的所有内存都可以(并且将)在返回结果后立即回收。
请注意,如果您关心游戏的垃圾收集速度,您宁愿首先关心一致的值类型。这可能会加快你的游戏速度;并且当使用=== 时,您可以确定不会产生垃圾。
【讨论】:
"5" == {valueOf: function(){ createLotsOfGarbage(); return 5; }}
== 没问题。仅使用(太多)不同类型会导致去优化 afaik。如果您在相同类型的操作数上使用==,它的性能将与=== 一样好。
== 操作符只有在实际对对象进行类型转换时才会创建任何对象。如果比较相同类型的值,则无需为比较创建任何值。
但是,您应该尝试确保您的数据是预期的类型。将值放入变量时转换一次比每次使用时都隐式转换要便宜。
【讨论】: