添加行console.log会导致不同的返回

时间:2017-07-10 09:05:49

标签: javascript

我在代码大战中做了一个kata并发现了

    function findNextSquare(sq) {
     var rt = Math.sqrt(sq);
     console.log((rt++)**2)
     return rt%1 !== 0 ? -1 : ((rt++)**2); 
    } //>> 144

    function findNextSquare(sq) {
     var rt = Math.sqrt(sq);
     //console.log((rt++)**2)
     return rt%1 !== 0 ? -1 : ((rt++)**2); 
    } //>> 121

也就是说,只需注释掉console.log会导致不同的返回值......

另外,值得注意:第一个控制台记录121,而不是144.

这里是repl.it:https://repl.it/languages/javascript

我想知道这是否与异步性有关。有人能解释为什么删除console.log会改变回报吗?

4 个答案:

答案 0 :(得分:7)

快速解决方案:

rt++

<强>解释

这与异步性无关。

console.log((rt++)**2)中的

rt 会导致rt变量递增。因此,当return到达rt + 1行时,rt会有所不同(比应该更多)。

注意区别:

  • rt是一个向rt++添加1并返回结果的表达式 - rt保持不变
  • rtrt添加1,将结果保存回++rt ,并返回 {{1} }
  • rtrt添加1,将结果保存回rt ,然后返回 {{1} }

让我们看看原始代码使用 sq = 16 做了什么,console.log 注释掉了:

function findNextSquare(sq) {            // sq = 16
  var rt = Math.sqrt(sq);                // rt = 4
  console.log((rt++) ** 2);              // logs 4^2 = 16, rt incremented to 5
  return rt % 1 !== 0 ? -1 : (rt++)**2;  // returns 5^2 = 25, rt incremented to 6 (unneeded)
}

当您删除 console.log时,结果如下:

function findNextSquare(sq) {            // sq = 16
  var rt = Math.sqrt(sq);                // rt = 4
  return rt % 1 !== 0 ? -1 : (rt++)**2;  // returns 4^2 = 16, THEN rt is incremented to 5
}

解决方案是向rt添加1,然后对新值进行平方。我们实际上不需要将新值保存回rt

function findNextSquare(sq) {              // sq = 16
  var rt = Math.sqrt(sq);                  // rt = 4
  return rt % 1 !== 0 ? -1 : (rt + 1)**2;  // returns (4 + 1)^2 = 25
}

如果你想要console.log,你可以拥有它,只要确保它不会改变rt

function findNextSquare(sq) {
  var rt = Math.sqrt(sq);
  console.log((rt + 1) ** 2);
  return rt % 1 !== 0 ? -1 : (rt + 1) ** 2; 
}

答案 1 :(得分:4)

语句console.log((rt++)**2)副作用rt增加1。

评论它显然具有rt少一个的效果,这可以解释121(11 * 11)和144(12 * 12)之间的差异。

答案 2 :(得分:2)

++运算符自动递增给定变量。而且它不只是console.log()

variableName++;等于写

时会发生什么

variableName = variableName + 1;

因此,无论您是否在++或其他地方使用了console.log()运算符,该变量都会逐渐增加。

小心你如何使用它。如果您仍想使用增量变量的控制台日志,我建议使用console.log(variableName + 1);

希望这有帮助!

答案 3 :(得分:2)

console.log增量rt值中使用的表达式。