Javascript 添加line console.log会导致不同的返回
我在做一个关于代码战的kata,发现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
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
行时会有所不同(比应该的多出一个)
请注意区别:
是将1添加到rt+1
并返回结果的表达式-rt
保持不变rt
将1添加到rt++
,将结果保存回rt
,并返回旧的rt
rt
将1添加到++rt
,将结果保存回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
值