【问题标题】:Does == create garbage ? (when comparing a string to a number)== 会产生垃圾吗? (将字符串与数字进行比较时)
【发布时间】:2015-03-26 17:39:37
【问题描述】:

我喜欢在比较值时不关心变量是字符串还是数字,所以我不使用 ==,而不是 ===。但是由于 == 在比较之前将两个值转换为相同的数据类型,它是否会产生垃圾并加剧游戏中那些讨厌的垃圾收集短暂的停顿?如果是这样,是否仅在将字符串与数字进行比较时,还是在将数字与数字以及字符串与字符串进行比较时?

【问题讨论】:

    标签: javascript garbage-collection


    【解决方案1】:

    是的,== 可以创建垃圾,因为它可能会在执行类型强制时调用对象上的 .toString().valueOf() 方法;并且这些方法可能会造成严重破坏(它们可以是用户定义的)。

    但是不,== 在比较(原始)字符串和(原始)数字时不会产生垃圾,进程中分配的所有内存都可以(并且将)在返回结果后立即回收。

    请注意,如果您关心游戏的垃圾收集速度,您宁愿首先关心一致的值类型。这可能会加快你的游戏速度;并且当使用=== 时,您可以确定不会产生垃圾。

    【讨论】:

    • 让我看看我是否理解。假设我有 a=5;和 c.b="5",当将它们与 if(a==c.b) 或 if(a
    • 是的,但我不认为比较数组会产生垃圾——它们是直接字符串化的。对象的示例是 "5" == {valueOf: function(){ createLotsOfGarbage(); return 5; }}
    • 嗯,好的。我从来没有做过这么奇怪的事情,创建一个会立即“死”的函数。从现在开始我将使用 ===,但实际上我对如何处理已经存在的数千个 == 犹豫不决。如果他们不制造垃圾,没问题。如果他们这样做(或者如果他们导致优化)那么我应该花时间来改变他们。这就是我问的原因。
    • 不,使用== 没问题。仅使用(太多)不同类型会导致去优化 afaik。如果您在相同类型的操作数上使用==,它的性能将与=== 一样好。
    【解决方案2】:

    == 操作符只有在实际对对象进行类型转换时才会创建任何对象。如果比较相同类型的值,则无需为比较创建任何值。

    但是,您应该尝试确保您的数据是预期的类型。将值放入变量时转换一次比每次使用时都隐式转换要便宜。

    【讨论】:

    • 然后我不知道该怎么做,例如我从 localStorage 读取的高分。它们以字符串的形式出现。我会将它们与分数进行比较,因此我应该将它们转换为数字以避免对 .valueOf() 的隐藏调用。但我也会在绘制高分时将它们与文本连接起来,因此如果它们是数字,则会隐藏对 .toString() 的调用。猜测哪个更糟并不明显。
    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多