NaN在这段代码中允许数字和字母的组合。

huangapple go评论95阅读模式
英文:

NaN is allowing a combination of numbers and letters in this code

问题

为什么NaN允许我的代码中组合数字和字母?

  1. let gameIsStarted = false;
  2. let guesses = [];
  3. const startButton = document.getElementById('startButton');
  4. startButton.addEventListener('click', function() {
  5. gameIsStarted = !gameIsStarted;
  6. if (gameIsStarted) {
  7. let n = 0;
  8. while (n <= 0) {
  9. n = Math.round(parseFloat(prompt('您已开始游戏。您希望猜测的最大数字是多少?')));
  10. if (isNaN(n)) {
  11. alert('那不是一个数字!请输入一个数字。');
  12. n = 0;
  13. } else if (n < 1) {
  14. alert('请输入1或更高的数字。');
  15. n = 0;
  16. }
  17. }
  18. let secretNum = secretNumber(n);
  19. guess(secretNum);
  20. function secretNumber(n) {
  21. return Math.floor(Math.random() * n) + 1;
  22. }
  23. function userGuess() {
  24. let guessValue = parseInt(prompt('您认为这个数字是多少?'));
  25. guessValue = Math.round(guessValue);
  26. return guessValue;
  27. }
  28. function guess(secretNum) {
  29. let userGuessValue = userGuess();
  30. while (userGuessValue !== secretNum) {
  31. switch (true) {
  32. case isNaN(userGuessValue):
  33. alert('那不是一个数字!');
  34. userGuessValue = userGuess();
  35. break;
  36. case userGuessValue <= 0:
  37. alert('那个数字太低了。请选择至少为1的数字。');
  38. userGuessValue = userGuess();
  39. break;
  40. case userGuessValue > n:
  41. alert('那个数字不在范围内,请重试。');
  42. userGuessValue = userGuess();
  43. break;
  44. case userGuessValue > secretNum:
  45. alert('不,尝试一个较低的数字。');
  46. userGuessValue = userGuess();
  47. break;
  48. case userGuessValue < secretNum:
  49. alert('不,尝试一个更高的数字。');
  50. userGuessValue = userGuess();
  51. break;
  52. }
  53. }
  54. alert('你猜对了!');
  55. }
  56. }
  57. gameIsStarted = false;
  58. });

我已经尝试使用元字符,问了我认识的每个人,但它仍然允许像13a或17w这样的输入。当我查看NaN的文档时,它在那里工作,所以为什么在我的代码中没有实现?

英文:

Why is NaN allowing a combination of numbers and letters in my code?

  1. let gameIsStarted = false;
  2. let guesses = [];
  3. const startButton = document.getElementById(&#39;startButton&#39;);
  4. startButton.addEventListener(&#39;click&#39;, function() {
  5. gameIsStarted = !gameIsStarted;
  6. if (gameIsStarted) {
  7. let n = 0;
  8. while (n &lt;= 0) {
  9. n = Math.round(parseFloat(prompt(&#39;You have begun to play. What is the highest number you wish to be able to guess?&#39;)));
  10. if (isNaN(n)) {
  11. alert(&#39;That is not a number! Please enter a number.&#39;);
  12. n = 0;
  13. } else if (n &lt; 1) {
  14. alert(&#39;Please enter a number 1 and above.&#39;);
  15. n = 0;
  16. }
  17. }
  18. let secretNum = secretNumber(n);
  19. guess(secretNum);
  20. function secretNumber(n) {
  21. return Math.floor(Math.random() * n) + 1;
  22. }
  23. function userGuess() {
  24. let guessValue = parseInt(prompt(&#39;What do you think the number is?&#39;));
  25. guessValue = Math.round(guessValue);
  26. return guessValue;
  27. }
  28. function guess(secretNum) {
  29. let userGuessValue = userGuess();
  30. while (userGuessValue !== secretNum) {
  31. switch (true) {
  32. case isNaN(userGuessValue):
  33. alert(&#39;That is not a number!&#39;);
  34. userGuessValue = userGuess();
  35. break;
  36. case userGuessValue &lt;= 0:
  37. alert(&#39;That number is too low. Pick a number that is at least 1.&#39;);
  38. userGuessValue = userGuess();
  39. break;
  40. case userGuessValue &gt; n:
  41. alert(&#39;That number is not in range, try again.&#39;);
  42. userGuessValue = userGuess();
  43. break;
  44. case userGuessValue &gt; secretNum:
  45. alert(&#39;No, try a lower number.&#39;);
  46. userGuessValue = userGuess();
  47. break;
  48. case userGuessValue &lt; secretNum:
  49. alert(&#39;No, try a higher number.&#39;);
  50. userGuessValue = userGuess();
  51. break;
  52. }
  53. }
  54. alert(&#39;You got it!&#39;);
  55. }
  56. }
  57. gameIsStarted = false;
  58. });

I have tried to use Metacharacters, I have asked everyone I know, but this will allow things like 13a or 17w. When I looked up the documentation on NaN, it worked there, so why is it not implementing in my code?

答案1

得分: 0

这将允许类似于13a或17w的情况。

罪魁祸首是parseIntparseFloat。它们允许数字后面跟着其他字符。

要严格验证输入,请使用一元number coercion

然后,根据您需要的数字类型执行其他检查。

函数 testNumber(值){
    console.log('Value:',value);
    console.log('> integer OR fractional:',Number.isFinite(value));
    console.log('> integer:',Number.isInteger(value));
    console.log('> fractional:',Number.isFinite(value)&& value!= Math.floor(value));
}

testNumber(+'777$#@!*');
testNumber(+'777.888');
testNumber(+'1234');

英文:

> this will allow things like 13a or 17w

The culprits are parseInt and parseFloat. They allow digits to be followed by other characters.

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-js -->

  1. console.log(parseInt(&#39;777$#@!*&#39;)); // 777
  2. console.log(parseFloat(&#39;123.56abcd&#39;)); // 123.56

<!-- end snippet -->

To validate the input strictly, use unary number coersion.

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-js -->

  1. console.log(+&#39;777$#@!*&#39;); // NaN
  2. console.log(+&#39;777&#39;); // 777
  3. console.log(+&#39;123.56abcd&#39;); // NaN
  4. console.log(+&#39;123.56&#39;); // 123.56

<!-- end snippet -->

Then you can perform other checks depending on what sort of number you need.

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-js -->

  1. function testNumber (value) {
  2. console.log(&#39;Value:&#39;, value);
  3. console.log(&#39;&gt; integer OR fractional:&#39;, Number.isFinite(value));
  4. console.log(&#39;&gt; integer:&#39;, Number.isInteger(value));
  5. console.log(&#39;&gt; fractional:&#39;, Number.isFinite(value) &amp;&amp; value != Math.floor(value));
  6. }
  7. testNumber(+&#39;777$#@!*&#39;);
  8. testNumber(+&#39;777.888&#39;);
  9. testNumber(+&#39;1234&#39;);

<!-- end snippet -->

huangapple
  • 本文由 发表于 2023年6月2日 05:21:15
  • 转载请务必保留本文链接:https://go.coder-hub.com/76385789.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定