【问题标题】:JavaScript Uglify is different and correct?JavaScript Uglify 不同且正确?
【发布时间】:2026-01-21 01:15:01
【问题描述】:

我有一个 uglified JS 文件,我想在其中获取美化版本,然后再次使用 grunt 对其进行 uglify。 我希望它和第一个 uglified 文件一样。

但是当我用“如果”做一部分时,情况就不同了。

这是丑化文件的一部分:

...function sendRequest(requestParams){if(Object.keys(requestParams).length>=1){$.ajax({type:"POST",url:VideoSearchUrl,data:requestParams,dataType:"xml"}).done(function(xmlDoc){buildResult($(xmlDoc)),responses++,requests==responses&&postSearchActions()})}}function...

但是美化文件中的丑化版本是这样的:

...function sendRequest(requestParams){Object.keys(requestParams).length>=1&&$.ajax({type:"POST",url:VideoSearchUrl,data:requestParams,dataType:"xml"}).done(function(xmlDoc){buildResult($(xmlDoc)),responses++,requests==responses&&postSearchActions()})}function...

为什么'if'被删除了? 在在线丑陋器中它仍然存在。

还是同一个意思?

【问题讨论】:

  • 您可以看到它在条件之后被替换为&&

标签: javascript grunt-contrib-uglify


【解决方案1】:

由于Short Circuit Evaluation,这是正确的。

由于逻辑表达式是从左到右计算的,因此使用以下规则测试它们是否存在可能的“短路”计算:

  • false && (anything) 短路评估为 false。
  • 真|| (anything) 短路评估为真。

逻辑规则保证这些评估总是正确的。 请注意,上述表达式的任何部分都不会被计算,因此这样做的任何副作用都不会生效。另外,请注意,上述表达式的任何部分都是任何单个逻辑表达式(如括号所示)。

(我强调)

a = 1;
b = 1;

if (a == b) {
  console.log(1);
}
// will log because it's like 
// (true) && expression
a == b && console.log(2);

// will NOT log because it's like 
// (false) && expression
a != b && console.log(3);

何必呢?

true&&expression 短于
if(true){expression}(每个字节都很重要)

【讨论】: