Javascript HeadFirst JS:代码示例中的问题

Javascript HeadFirst JS:代码示例中的问题,javascript,Javascript,该函数的目的是验证输入。输入应包括两个字符:第一个字符A-G;第二类:0-6;e、 g A0;B2。这个例子摘自这本书。 我想了解行中是否有这样一个点:“guess===null(字符串是否可以等于null?);“列=model.boardsize; 请注意,model.boardsize是指定的数字。在本例中,它是7 function parseGuess(guess) { var alphabet = ["A" , "B" , "C", "D", "E", "F", "G"];

该函数的目的是验证输入。输入应包括两个字符:第一个字符A-G;第二类:0-6;e、 g A0;B2。这个例子摘自这本书。 我想了解行中是否有这样一个点:“guess===null(字符串是否可以等于null?);“列<0”行>=model.boardsize; 请注意,model.boardsize是指定的数字。在本例中,它是7

function parseGuess(guess) {
  var alphabet = ["A" , "B" , "C", "D", "E", "F", "G"];


   if (guess===null || guess.length !== 2) {

       alert("Oops, please enter a letter and a number on the board.");
    } else {
      var firstChar = guess.charAt(0);
      var row = alphabet.indexOf(firstChar);
      var column = guess.charAt(1);

      if (isNaN(row) || isNaN(column)) {
        alert("Oops, that isn't on the board.");
      } else if (row < 0 || row >= model.boardSize ||
        column < 0 || column >= model.boardSize) {

        alert("Oops, that's off the board!");

      } else {
        return row + column;
      }
    }
    return null;
};
函数解析猜测(猜测){
变量字母表=[“A”、“B”、“C”、“D”、“E”、“F”、“G”];
if(guess==null | | guess.length!==2){
警告(“哦,请在黑板上输入字母和数字。”);
}否则{
var firstChar=guess.charAt(0);
var row=字母表indexOf(第一字符);
var列=guess.charAt(1);
if(isNaN(行)| | isNaN(列)){
警惕(“哦,那不在黑板上。”);
}如果(行<0 | |行>=model.boardSize||
列<0 | |列>=型号.板尺寸){
警告(“哎呀,这太离谱了!”);
}否则{
返回行+列;
}
}
返回null;
};

我没有读过这本书,也不清楚这个函数是如何被调用的,但是我想说,对于判断
guess
是否具有良好的预期值来说,这是一个非常糟糕的检查。首先检查
null
的典型原因是,如果
guess
null
,那么
guess.length
将抛出
TypeError
,因为
null
没有
length
属性。由于这是OR条件中的第一次检查,因此当
guess
null
时,它会使后半部分短路并立即显示
alert()

但是,如果
guess
未定义的
(函数调用中未传递参数的常见情况)或布尔值,也会引发错误。此外,对象、数组和其他数据结构也具有
length
属性,这意味着它们可以通过第一个
if
条件测试,但是像
indexOf
charAt
这样的方法会抛出错误。您可能希望将其更改为以下内容:

if (typeof guess !== 'string' && guess.length !== 2) {

至于电路板大小,是的,您需要检查列是否小于0或大于大小,否则您将选择超出范围的内容,并且您的程序将抛出错误。

是的,字符串可以为null,甚至等于null。您如何看待列<0;行>=model.boardSize?这些条件在这段代码中是必要的吗?@Adam字符串不能为空。在JS中,string和null是不同的数据类型。变量不能同时为string和null。字符串可以为空(“”),但这与为null不同。即使像
newstring(null)
这样的东西也会创建对象字符串“null”。@skyline3000,即使要执行var myName='null'@亚当:没错。这意味着
myName
等于字符串“null”,但这与数据类型
null
不同(这是此函数要检查的内容)。请参阅:关于数据类型和基元值。用户在中插入guess:在这种情况下,函数中不太可能出现字符串以外的任何内容,因为
元素的
属性始终是
DOMString
,即使它是空的,但您永远不知道客户端机器中发生了什么,因此,它仍然被认为是确保使用字符串的最佳实践。为了澄清,您实际上并没有检查字符串是否等于null。JavaScript是一种动态类型化语言,这意味着变量在任何时候都可以是任何数据类型。您正在检查传递给函数的参数是否为字符串。