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