Javascript HeadFirst JS:代码示例中的问题
该函数的目的是验证输入。输入应包括两个字符:第一个字符A-G;第二类:0-6;e、 g A0;B2。这个例子摘自这本书。 我想了解行中是否有这样一个点:“guess===null(字符串是否可以等于null?);“列<0”行>=model.boardsize; 请注意,model.boardsize是指定的数字。在本例中,它是7Javascript 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"];
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是一种动态类型化语言,这意味着变量在任何时候都可以是任何数据类型。您正在检查传递给函数的参数是否为字符串。