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

标签 javascript

我正在做一个关于代码 war 的 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 会改变返回值吗?

最佳答案

快速解决方案:

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

说明:

这与异步性无关。

<强> rt++console.log((rt++)**2)导致rt变量递增。因此,rt当到达 return 时会有所不同(比应有的多一个)线。

注意区别:

  • rt + 1是一个将 1 添加到 rt 的表达式并返回结果 — rt保持不变
  • rt++ rt 加 1 , 将结果保存回rt ,并返回 rt
  • ++rt rt 加 1 , 将结果保存回rt ,并返回 rt

让我们看看您的原始代码对 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; 
}

关于javascript - 添加行 console.log 会导致不同的返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45007895/

相关文章:

javascript - jQuery JSON API 不工作

javascript - 使用 json 数组中的 javascript 在 html 中呈现动态选择选项

javascript - 帮助避免全局命名空间 - 两个例子 - 哪个更好?

javascript - 我有一个 .log 对象文件,如何将它们转换为 JSON 对象以便在 Javascript 中进行迭代?

javascript - 更改表中按钮的文本

javascript - Angular UI Router - 使用 ui-sref 导航到动态状态时会出现双斜杠

javascript - Android Ionic Framework中如何进行跨域http请求?

javascript - 具有 ID 的 DOM 树元素会成为全局属性吗?

javascript - 使用 Javascript 获取所有(未知)<li> 元素的属性

javascript - 迷失在节点的海洋中