我正在创建一个功能,应该为经销商和玩家添加三张牌的总和。然后应该评估这些值,并且从函数返回的内容应该是推荐,“安全”,“停止”,“黑色插孔”或“被破坏”。将有两种不同的功能来评估玩家的牌和经销商的牌。请查看我编写的代码。我想我已经把它想象成代码,我只有一个问题。
function printResult(p1, p2, p3, d1, d2, d3) {
var x = p1 + p2 + p3;
var ab = "player:" + " " + player(x);
var y = d1 + d2 + d3;
var de = "dealer:" + " " + dealer(y);
return ab + ", " + de;
};
function player(p1, p2, p3) {
var summa = p1 + p2 + p3
var result;
if (summa < 21)
result = "safe";
else if (summa = 21)
result = "black jack";
else
result = "busted";
return result;
}
function dealer(d1, d2, d3) {
var summa = d1 + d2 + d3;
var dealer;
if (summa < 17)
dealer = "safe";
else if (summa >= 17 && summa <= 20)
dealer = "stop";
else if (summa == 21)
dealer = "black jack";
else
dealer = "busted";
return dealer;
}
当我打印printResult(4,8,1,3,8,4)时,它给了我一个错误的推荐(玩家在它应该安全时被破坏)。
但是,如果我将代码更改为以下内容,那么它可以正常工作。
function printResult(p1, p2, p3, d1, d2, d3) {
var x = p1 + p2 + p3;
var ab = "player:" + " " + player(p1, p2, p3);
var y = d1 + d2 + d3;
var de = "dealer:" + " " + dealer(d1, d2, d3);
return ab + ", " + de;
};
我不明白为什么结果会有差异? Ps,在后面的代码中我理解我不必将x和y作为变量,它们可以被删除。
提前致谢!
答案 0 :(得分:5)
有区别:
var x = p1 + p2 + p3;
var ab = "player: " + player(x);
您使用一个参数player
来调用x
,其中包含变量的总和。这是有效的代码,但其他参数现在为undefined
。为了说明,您的功能实际上看起来像:
function player(p1, p2, p3) {
var summa = p1 + p2 + p3 //p1 is x, p2 is undefined, p3 is undefined
...
else
result = "busted";
return result;
}
让我们说x = 2
。当您尝试添加2 + undefined + undefined
时,JavaScript将返回NaN
(非数字),这就是变量summa
将设置为的内容。现在唯一的出路就是通过“被破坏”,因为你的if-else的其他条件都没有达到(只有其他)。
这可以通过以下方式解决:
var summa = (p1 + p2 + p3) || (p1 + p2) || p1;
这基本上意味着您只添加传递给函数的参数,即存在的参数。
答案 1 :(得分:3)
Javascript允许您不指定d2
&amp; d3
函数的player
参数,但如果它们不存在,则其值undefined
和x + undefined + undefined
为NaN
(非数字的特殊值) )
如果您想允许两种方式调用您的函数,您可以在顶部添加一个将undefined转换为0的检查:
function player(p1, p2, p3) {
p1 = p1 || 0;
p2 = p2 || 0;
p3 = p3 || 0;
var summa = p1 + p2 + p3
var result;
if (summa < 21)
result = "safe";
else if (summa = 21)
result = "black jack";
else
result = "busted";
return result;
}
这种语法有效,因为undefined
是'falsey'所以将使用0的值,0也是'falsey',但它并不重要,因为它将被0替换,所有其他值将保持为他们是'真实的'