所以,我正在接受JavaScript,因为我似乎很喜欢它。我买了一个在线课程,现在我的代码遇到了挑战。这是一个非常简单的,所以希望其中一位专家可以帮助那些可怜的家伙(我)。
我有以下代码,据我所知,应该是正确的:
var johnAge = 25;
var markAge = 30;
var steveAge = 40;
var johnHeight = 170;
var markHeight = 175;
var steveHeight = 150;
var John, Mark, Steve;
John = johnHeight + 5 * johnAge;
Mark = markHeight + 5 * markAge;
Steve = steveHeight + 5 * steveAge;
console.log('John: ' + John);
console.log('Mark: ' + Mark);
console.log('Steve: ' + Steve);
if (John > Mark && Steve) {
console.log('John wins!');
} else if (Mark > Steve && John) {
console.log('Mark wins!');
} else if (Steve > John && Mark) {
console.log('Steve wins!');
} else {
console.log("it's a draw.");
}
这是我的问题:
约翰:295 马克:325 史蒂夫:350 史蒂夫赢了!现在,这款游戏的目的是让拥有最高分的人赢得比赛。根据他的分数,史蒂夫显然是胜利者。
问题出在这一部分:
} else if (Mark > Steve && John) {
console.log('Mark wins!');
} else if (Steve > John && Mark) {
console.log('Steve wins!');
如果我做出以下更改,它将显示“马克”赢了比赛:
} else if (Mark > John && Steve) {
console.log('Mark wins!');
}
我只是在'John'和'Steve'之间切换位置。如果约翰先来,它会显示'马克赢了比赛',如果史蒂夫来了冷杉,它继续前进并执行下一个'其他如果',这是'史蒂夫赢得比赛'。
我不明白为什么改变我的变量之间的位置导致如此巨大的差异,即使我正在使用逻辑和&&。
当我使用二进制和&时,似乎不存在这个问题。虽然,据我所知,二进制文件并不适合编码,并且没有太多真正的应用程序可供使用。
所以,如果可能的话,我想解决这个问题,我的使用&&而不是依靠&。
我真的不明白这些变化及其原因。
提前感谢您帮助和指导我。
〜干杯
答案 0 :(得分:3)
你需要像这样检查玩家对其他两个人:
你现在拥有if语句的方式是Steve > John(true) && Mark(true)
。
var johnAge = 25;
var markAge = 30;
var steveAge = 40;
var johnHeight = 170;
var markHeight = 175;
var steveHeight = 150;
var John, Mark, Steve;
John = johnHeight + 5 * johnAge;
Mark = markHeight + 5 * markAge;
Steve = steveHeight + 5 * steveAge;
console.log('John: ' + John);
console.log('Mark: ' + Mark);
console.log('Steve: ' + Steve);
if (John > Mark && John > Steve ) {
console.log('John wins!');
} else if (Mark > Steve && Mark > John) {
console.log('Mark wins!');
} else if (Steve > John && Steve > Mark) {
console.log('Steve wins!');
} else {
console.log("it's a draw.");
}
答案 1 :(得分:3)
您可以执行此操作,只需创建一个符合您需求的改进>
运算符即可。但请继续关注,直到这个答案结束。我们将讨论一些我们真正需要讨论的事情
const gtAll = (x, y, ...ys) =>
ys.length === 0
? x > y
: x > y && gtAll (x, ...ys)
console.log ('5 is greater than 4, 3, and 2', gtAll (5, 4, 3, 2))
// true
console.log ('5 is greater than 4, 3, and 7', gtAll (5, 4, 3, 7))
// false

在您的程序中,您可以像下面一样使用它。
if (gtAll (John, Mark, Steve))
console.log ("John wins")
else if (gtAll (Mark, Steve, John))
console.log ("Mark wins")
else if (gtAll (Steve, John, Mark))
console.log ("Steven wins")
else
console.log ("draw")
但是如果我们稍微缩小一点,那么你的程序需要解决的问题更严重。让我们来看看一些突出的事情。
有一堆名为fooColor
,fooSize
,fooAdjective
的变量?你可能正在寻找一个对象。
var johnAge = 25
var johnHeight = 170
var john = { name: 'John', age: 25, height: 170 }
为同类的值分配多个变量,即John
,Mark
,Steve
?您可能正在寻找阵列。
var John = { ... }
var Mark = { ... }
var Steve = { ... }
const people =
[ { name: 'John', age: 25, height: 170 }
, { name: 'Mark', age: 30, height: 175 }
, { name: 'Steve', age: 40, height: 150 }
]
您是否觉得自己开始重复自己?使用函数执行重复任务
John = johnHeight + 5 * johnAge;
Mark = markHeight + 5 * markAge;
Steve = steveHeight + 5 * steveHeight;
const score = p =>
p.height + 5 * p.age
console.log (score (people [0])) // John
// 295
console.log (score (people [1])) // Mark
// 325
console.log (score (people [2])) // Steve
// 350
console.log (people.map (score))
// [ 295, 325, 350 ]
这是对您的计划的重写。最重要的是请注意,我们甚至没有最终使用gtAll
,因为现在我们的人员被表示为数组中的对象,因此有更好的方式来思考问题。并记住使用重复工作的功能!
const people =
[ { name: 'John', age: 25, height: 170 }
, { name: 'Mark', age: 30, height: 175 }
, { name: 'Steve', age: 40, height: 150 }
]
const score = (p) =>
p.height + 5 * p.age
const determineWinner = (contested, challenger) =>
{
if (score (challenger) > score (contested))
return challenger
else if (score (challenger) === score (contested))
return { ...contested, name: "tie" }
else
return contested
}
const winner =
people.reduce (determineWinner)
console.log ("the winner is", winner)
// the winner is { name: 'Steve', age: 40, height: 150 }
console.log ("the winner is", winner.name)
// the winner is Steve

严重,请注意我们可以轻松地将其他人添加到people
,并且我们的计划不必更改以确定获胜者。例如,如果我们添加了Charlie
var charlieAge = 60
var charlieHeight = 180
var Charlie = charlieHeight + 5 * charlieAge
然后我们必须改变所有if
语句。您可以看到这根本无法扩展
if (gtAll (John, Mark, Steve))
if (gtAll (John, Mark, Steve, Charlie))
console.log ("John wins")
else if (gtAll (Mark, Steve, John))
else if (gtAll (Mark, Steve, John, Charlie))
console.log ("Mark wins")
else if (gtAll (Steve, John, Mark))
else if (gtAll (Steve, John, Mark))
console.log ("Steven wins")
else if (gtAll (Charlie, John, Mark, Steve))
console.log ("Charlie wins")
else
console.log ("draw")
将其与简单地将Charlie添加到我们的people
数组
const people =
[ { name: 'John', age: 25, height: 170 }
, { name: 'Mark', age: 30, height: 175 }
, { name: 'Steve', age: 40, height: 150 }
, { name: 'Charlie', age: 60, height: 180 }
]
const winner =
people.reduce (determineWinner)
console.log (winner.name)
// Charlie
此答案的参考资料
答案 2 :(得分:0)
您希望在&&
运算符的两边使用比较:
if(Mark > Steve && Mark > John)
&&
运算符将其操作数视为布尔值。表达式if(Mark > Steve && John)
表示
如果两者都是真的:
- 当
Mark
大于Steve
和John
被强制转换为布尔值时,true
的值为John
(即,对于数字,当John
非零时)
这显然不是你想要测试的。