2017-07-10 21 views
0

我正在做的代碼戰爭中卡塔和發現添加的console.log導致不同的返回

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 

這是說,只要註釋掉控制檯行.LOG導致不同的返回值...

此外,值得一記:第一個控制檯日誌121,而不是144

這是在repl.it:https://repl.it/languages/javascript

我不知道這是否與異步性有關。有人可以解釋爲什麼刪除console.log更改返回?

+4

因爲你通過執行'rt ++'來增加控制檯日誌中的'rt'值, –

回答

4

聲明console.log((rt++)**2)具有由1

增加rt評出來明顯具有rt其效果是一個更小,佔121(11 * 11)和144之間的差的副作用 (12 * 12)。

7

快速的解決方案:

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++加1 rt並將結果保存回rt的表達,返回rt
  • ++rt加1 rt並將結果保存回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 
} 

解決方案是將1添加到rt然後正方形的新值。我們實際上並不需要保存回新值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; 
} 
2

運算符++自動遞增給定變量。它不僅僅是爲了console.log()

,當你這樣做是否你已經使用了++運營商console.log()內或其他地方,該變量被遞增好variableName++;等於寫

variableName = variableName + 1;

會發生什麼。

小心你如何使用它。如果你想仍然使用增加變量的控制檯日誌,我會建議使用console.log(variableName + 1);

希望這有助於!

2

表達式用於console.log增量rt值。

相關問題