【问题标题】:== vs. === in a remote JavaScript file. Which one is faster? [duplicate]== 与 === 在远程 JavaScript 文件中。哪个更快? [复制]
【发布时间】:2012-05-02 20:07:35
【问题描述】:

可能重复:
JavaScript === vs == : Does it matter which “equal” operator I use?

在 JavaScript 中比较相同类型的两个操作数是否相等时,使用 ===== 在概念上没有任何区别,所以我想知道哪个运算符实际上更快,例如在我的情况下, JavaScript 文件必须从远程 Internet 位置下载。

虽然严格相等运算符 === 可能在许多用户代理上执行得更快,但它还需要 8 位以上的未压缩信息与 JavaScript 文件一起在网络上传输。

碰巧的是,今天的平均 CPU 在执行数百个条件跳转时比 Internet 连接在提供单个位时要快得多,所以我热衷于使用 == 而不是 ===!= !== 在可能的情况下。然而,阅读这么多推荐相反的博客,我感到很困惑。

有什么我遗漏的重点吗?

【问题讨论】:

  • 我认为它在概念上有所不同
  • “多 8 位未压缩信息”并不意味着再发送 8 位。如果 JS 文件以 gzip 格式提供,那 1 个额外的字符几乎没有什么区别。
  • 宽松和严格有不同的目的。你无法比较两个运作方式不同的东西。
  • -1 从性能角度比较这些运算符的问题是 IMO 的一个坏问题。它们完全不同。
  • @bažmegakapa:不,在问题中提到的两个操作数保证为相同类型的情况下,它们是相同的。

标签: javascript performance download comparison-operators


【解决方案1】:

正如您所说,为了保证两个操作数属于相同类型的比较,两个运算符被指定为执行完全相同的步骤,并且除非编译器优化,否则它们的执行可能足够接近相同。因此,在这些情况下,使用== 比使用=== 在文件大小方面略有优势。

但是,有些人认为一致性更重要:=== 通常更接近您在测试相等性时的意图,并且仅使用===!== 是许多人认为有用且可读的东西。就我个人而言,我有相反的规则,只有在操作数的类型不确定时才使用===,但我不会推荐任何一种方式。

如果您了解严格相等和非严格相等之间的区别,并且您确信使用 ==!= 不会导致您或其他任何人在将来阅读和理解代码时遇到任何问题,继续使用它们。

【讨论】:

    【解决方案2】:

    可能推荐一个而不是另一个的博客这样做是出于与类似操作的逻辑一致性的原因,而不是为了速度。试图修剪你的 Javascript 程序以从脚本中删除单个字符是不明智的。在提供服务之前通过 minify 或其他自动化工具运行它是一回事,但是手动调整 Javascript 以实现最小文件大小或单个操作数级别的执行速度是一项无止境的、吃力不讨好的任务,这将使您的网站更难维护。

    使用对您来说更具逻辑意义的任何操作数,这样当您两年后不记得这条查询线时,您就不会感到困惑。

    【讨论】:

      【解决方案3】:

      如果我可以引用 Douglas Crockford 的 Javascript: The Good Parts

      JavaScript 有两组相等运算符:=== 和 !==,以及它们的 邪恶的双胞胎 == 和 !=。好的工作按您期望的方式工作。 如果两个操作数类型相同且值相同,则 === 产生真,!== 产生假。当操作数属于同一类型时,邪恶双胞胎会做正确的事,但如果它们属于 不同的类型,他们试图强制这些值。规则由 他们所做的事情既复杂又难以忘怀……缺乏 传递性令人担忧。我的建议是永远不要使用邪恶的双胞胎。 相反,请始终使用 === 和 !==。

      无论是否存在性能差异,都很难证明使用“邪恶双胞胎”是合理的。

      【讨论】:

      • 如问题中所述,当操作数保证为同一类型时,这不适用。
      • 由于 Javascript 是一种动态语言,因此所进行的逻辑比较是否针对具有相同类型的两个对象并不总是很清楚。在我看来,最好不要冒险。
      • 这是一个合理的态度。我之所以提到它,是因为这个问题似乎是专门询问操作数类型何时相同。
      【解决方案4】:
      var test="1";
      console.log(test==1); // true
      console.log(test===1); // false
      

      == 检查 test 是否有 1 但 === 检查 test 是否有 1 并检查它的数据类型。在这种情况下,第二个表达式为假,因为它的数据类型是字符串(测试是字符串),但右手操作数不是字符串。下面的测试不同

      var test=1;
      console.log(test==1); // true
      console.log(test===1);​ // true
      

      因为 test 包含 Integer 1 ,其计算结果为 Boolean true 并且右手操作数也是相同的。 === 还会检查两个操作数是否类型。

      【讨论】:

        猜你喜欢
        • 2014-05-17
        • 1970-01-01
        • 2010-11-07
        • 2011-06-02
        • 2023-03-04
        • 1970-01-01
        • 2011-04-08
        • 2012-09-30
        • 1970-01-01
        相关资源
        最近更新 更多