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

Javascript 添加line console.log会导致不同的返回,javascript,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); //c

我在做一个关于代码战的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

这是回复上的内容:


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

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


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

快速解决方案:

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

说明:

function findNextSquare(sq) {
  var rt = Math.sqrt(sq);
  return rt % 1 !== 0 ? -1 : (rt + 1)**2; 
}
这与异步性无关

rt++
控制台中。log((rt++)**2)
使
rt
变量递增。因此,
rt
在到达
return
行时会有所不同(比应该的多出一个)

请注意区别:

  • rt+1
    是将1添加到
    rt
    并返回结果的表达式-
    rt
    保持不变
  • rt++
    将1添加到
    rt
    将结果保存回
    rt
    ,并返回旧的
    rt
  • ++rt
    将1添加到
    rt
    将结果保存回
    rt
    ,并返回新的
    rt
让我们看看您的原始代码在
sq=16
上做了什么,并将
控制台.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
}
function findNextSquare(sq) {
  var rt = Math.sqrt(sq);
  console.log((rt + 1) ** 2);
  return rt % 1 !== 0 ? -1 : (rt + 1) ** 2; 
}
如果您想要一个
console.log
,您可以拥有它,只要确保它不会更改
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
}
function findNextSquare(sq) {
  var rt = Math.sqrt(sq);
  console.log((rt + 1) ** 2);
  return rt % 1 !== 0 ? -1 : (rt + 1) ** 2; 
}

++
运算符自动递增给定变量。而且它不仅仅适用于
console.log()

当您执行
variableName++等于写入

variableName=variableName+1

因此,无论您是在
控制台.log()
中还是在其他地方使用了
++
运算符,变量都会永久递增

使用时要小心。如果您仍然希望使用带有递增变量的控制台日志,我建议使用
console.log(variableName+1)


希望这有帮助

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

因为您通过执行
rt++
来增加控制台日志中的
rt