【问题标题】:Optimizing conditionals/if blocks, what is preferable from a performance point of view?优化条件/if 块,从性能的角度来看,什么是可取的?
【发布时间】:2015-12-13 10:41:24
【问题描述】:

我正在编写一个 JS 库,但有两件事在我的脑海中已经有很长一段时间了。

考虑一个选项:

var option = { bool : true } ;

现在,想象一下我会这样做

if(option.bool) 

      or

if(option.bool === true) 

第一种情况,尽管知道它是真假,但我想它相当于:

var tmp = options.bool;
if ( tmp !== undefined && tmp !== null && ( tmp === true || tmp ... ) 

这意味着要尝试 options.bool = true,它必须在测试 true 之前检查 undefined 和 not null。

因此,后一种情况应该更高效。但是,后一种情况需要更多的字符,如果重复多次,会导致更大的库。

但也许我的理解是不正确的。

现在,即使我这样做:

var bool = window.t ? true : false; 

if ( bool === true ) // I still have to check for true to 'have the optmimal version'?

也许最后一种情况可以由编译器优化,但是当它是一个全局选项我想它会有所不同?

请与我分享您对此的看法。

【问题讨论】:

  • 如果您真的要询问if(option.bool)if(option.bool === true) 之间的性能差异,那么所有性能问题的答案都是运行一个代表您特别感兴趣的环境的测试。jsperf是进行此类测试的绝佳工具。没有实际测试结果的推测通常是错误的。
  • @jfriend00 我只想知道我的编码模式应该是什么。我曾经有很多 if ( object ),但后来我将其更改为严格相等,但它总共导致了更多的字符。我不确定对这种性质的简单测试是否能帮助我弄清楚,我想知道什么是好的做法。
  • 如果您知道option.bool 仅包含truefalse,或者如果您愿意接受任何真实值,那么 if (option.bool) 是一个非常好的做法。我认为没有理由做if (option.bool === true),除非您认为option.bool 可能具有非真/假值,并且您想从if 语句中消除任何其他可能的真实值。
  • 好的,知道了。例如,可能返回未定义的方法,或者一个和对象 {} 并执行 if ( tmp = method() );如果它未定义,它将立即失败,但如果不是,它将检查它是否是一个字符串并且长度 > 0 .. 一个大于零的数字。这也是另一个问题。

标签: javascript google-chrome firefox


【解决方案1】:

答案很简单。与其说是编码模式,不如说是逻辑。 在这种情况下,总是有 3 种可能性,您需要满足每一种可能性。 IE。 1. 正确 2. 错误 3. 未定义 如果该值未定义,那么您希望它属于 true 还是 false 子句?还是应该以不同的方式迎合?

要记住的另一件重要的事情是,如果它未定义,那么它将始终执行 false 子句中的代码。这就是你想要的吗?

如果您知道该值将始终为 true 或 false,那么我建议您仍然使用语法 == true,因为这样更具可读性。浏览代码的人会知道您正在寻找布尔值,而不是测试该字段是否已设置。

每次你在 if 语句中有一个布尔值时,你都必须考虑这 3 种情况,所以没有一个适合你的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 2011-03-24
    • 2017-09-29
    相关资源
    最近更新 更多