我在代码大战中做了一个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会改变回报吗?
答案 0 :(得分:7)
快速解决方案:
rt++
<强>解释强>
这与异步性无关。
console.log((rt++)**2)
中的 rt
会导致rt
变量递增。因此,当return
到达rt + 1
行时,rt
会有所不同(比应该更多)。
注意区别:
rt
是一个向rt++
添加1并返回结果的表达式 - rt
保持不变rt
向rt
添加1,将结果保存回++rt
,并返回旧 {{1} } rt
为rt
添加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
值中使用的表达式。