【问题标题】:Using typeof operator in JS correctly?在 JS 中正确使用 typeof 运算符?
【发布时间】:2019-01-08 10:44:18
【问题描述】:

我正在用 JavaScript 制作一个简单的刽子手游戏。我正在尝试添加新功能,我想添加的功能之一是检查用户提供的输入(当他们猜测未知单词的字母时)以确保它实际上是字母数字输入(或者我的目的是检查输入不是像“!”这样的符号或像“5”这样的数字)。

我知道我可能会使用一个包含所有有效字符的全局变量并根据这些字符检查输入,但我想知道是否有内置方法。我找到了 typeof 运算符,但似乎我正在检查的字符类型被 JavaScript 转换为字符串。

我试图在其中实现的循环:

while (remainingLetters > 0 && numberOfGuesses > 0) {
alert(answerArray.join(" "));
alert("You have " + numberOfGuesses + " guesses remaining.");

var guess = prompt("Guess a letter, or click \
'Cancel' to stop playing.").toLowerCase();

if (guess === null) {
  break;
} else if (typeof guess === "number") {
  alert("Please enter a single LETTER.");
} else if (guess.length !== 1) {
  alert("Please enter a single letter.");
} else {
  for (var j = 0; j < word.length; j++) {
    if (word[j] === guess) {
      answerArray[j] = guess;
      remainingLetters--;

// there is some code missing here that I'm pretty sure is not essential 
// to my question!

当我在 Chrome 的开发工具中运行它时,我可以输入“2”并且它永远不会给我我正在寻找的警报 - 它不会崩溃或任何它只是重新启动循环(这是状态在我尝试实现这个“功能”之前的现状)。

提前致谢!

【问题讨论】:

标签: javascript validation ecmascript-6


【解决方案1】:

这段代码的问题是prompt 总是返回一个string 值。这些值可能会也可能不会转换为Number;此转换将使用parseIntparseFloat 执行。 (如果字符串可以转换为数值,则这些方法返回该值;否则,它们返回 NaN。)但是,typeof 不执行插值 - 它说明变量的类型,因为它存在,而不是任何它可能被转换成的类型。因此,typeof guess 将始终评估为 string。要检查字符串是否包含数值,可以使用条件if (!isNaN(parseInt(guess))if (!isNaN(parseFloat(guess))(请注意,必须使用isNaN 方法而不是传统的相等检查)。

但是,您可能希望围绕确保条目一个字母而不是考虑它可能不是的无数方式来构建检查。例如,@ 不是数字,但它们也不是字母。同样,如果您的answerArray 仅包含没有变音符号的拉丁字母,您可能希望禁止猜测éç 等字符。因此,考虑使用 RegEx 来检查猜测的字符串是否包含可接受的字母。与this Stack Overflow post 一样,您可以使用以下if 语句来确保字符串为一个字符且为有效字母:if (str.length === 1 &amp;&amp; str.match(/[a-z]/))。您可以参考该帖子以了解如何处理更复杂的字符集(例如,非拉丁字母或带有变音符号的字符)。

【讨论】:

  • 感谢您的全面回答。我对这一切还是很陌生,但看起来终于开始学习正则表达式是一个新目标。
猜你喜欢
  • 2011-06-03
  • 2015-06-18
  • 2011-02-08
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多