Javascript 更改后,将其他两个变量相加
请看下面的代码。我很难理解其中的一个问题:Javascript 更改后,将其他两个变量相加,javascript,variables,reference,Javascript,Variables,Reference,请看下面的代码。我很难理解其中的一个问题: let sideCount = 0; let mealCount = 0; let itemCount = sideCount + mealCount; const pizzaOrder = ({size, crustType, topping, quantity}) => { quantity = Math.round(parseInt(quantity)); mealCount += quantity; if (to
let sideCount = 0;
let mealCount = 0;
let itemCount = sideCount + mealCount;
const pizzaOrder = ({size, crustType, topping, quantity}) => {
quantity = Math.round(parseInt(quantity));
mealCount += quantity;
if (topping === "") {
console.log(`Order: ${quantity} ${size.toTitleCase()} ${crustType.toLowerCase()} crust plain cheese pizza`);
} else {
console.log(`Order: ${quantity} ${size.toTitleCase()} ${crustType.toLowerCase()} crust ${topping} pizza`);
}
console.log(`Meal Count after ordering ${quantity} pizzas: ${mealCount}`);
console.log(`Current item count: ${itemCount}`);
};
(还有更多,但这才是问题的关键)
我在StackOverflow中查找了所有引用和按值传递或按引用传递,但找不到任何解决问题的方法
当我更新mealCount
时,它不会更改itemCount
的值。我该如何解决这个问题
Order: 10 Medium thin crust pepperoni pizza
Meal Count after ordering 10 pizzas: 10
Current item count: 0
Order: 3 burgers with Relish
Meal Count after ordering burger: 13
Current item count: 0
Meal Count: 0 Side Count: 0
Meal Count: 0
Side Count: 0
Meal Count: 0
Side Count: 0
Your total is $0.00. Enjoy your meal!
代码按顺序解释(计算)
当你写作时:
让itemCount=边计数+边计数
实际上,您将sideCount+mealCount的值分配给itemCount。此时,sideCount和mealCount的值为“0”,因此itemCount等于“0”
调用函数pizzaOrder并更改mealCount(在该函数中)不会使javascript再次重新计算所提到的行(让itemCount=sideCount+mealCount)
从字面上看,pizzaOrder函数根本不影响变量“itemCount”
一个问题解决方案是添加行:
pizzaOrder函数中的“itemCount=sideCount+mealCount”,特别是在“mealCount+=quantity;”行下
因此,您的代码如下所示:
const pizzaOrder = ({size, crustType, topping, quantity}) => {
quantity = Math.round(parseInt(quantity));
mealCount += quantity;
totalCount = mealCount + sideCount;
if (topping === "") {
console.log(`Order: ${quantity} ${size.toTitleCase()} ${crustType.toLowerCase()} crust plain cheese pizza`);
} else {
console.log(`Order: ${quantity} ${size.toTitleCase()} ${crustType.toLowerCase()} crust ${topping} pizza`);
}
console.log(`Meal Count after ordering ${quantity} pizzas: ${mealCount}`);
console.log(`Current item count: ${itemCount}`);
};
代码按顺序解释(计算)
当你写作时:
让itemCount=边计数+边计数
实际上,您将sideCount+mealCount的值分配给itemCount。此时,sideCount和mealCount的值为“0”,因此itemCount等于“0”
调用函数pizzaOrder并更改mealCount(在该函数中)不会使javascript再次重新计算所提到的行(让itemCount=sideCount+mealCount)
从字面上看,pizzaOrder函数根本不影响变量“itemCount”
一个问题解决方案是添加行:
pizzaOrder函数中的“itemCount=sideCount+mealCount”,特别是在“mealCount+=quantity;”行下
因此,您的代码如下所示:
const pizzaOrder = ({size, crustType, topping, quantity}) => {
quantity = Math.round(parseInt(quantity));
mealCount += quantity;
totalCount = mealCount + sideCount;
if (topping === "") {
console.log(`Order: ${quantity} ${size.toTitleCase()} ${crustType.toLowerCase()} crust plain cheese pizza`);
} else {
console.log(`Order: ${quantity} ${size.toTitleCase()} ${crustType.toLowerCase()} crust ${topping} pizza`);
}
console.log(`Meal Count after ordering ${quantity} pizzas: ${mealCount}`);
console.log(`Current item count: ${itemCount}`);
};
如果要保持订单的“状态”,您可能需要使用一个对象,该对象可以在任何需要的地方公开:
const count = {
sideCount: 0,
mealCount: 0,
itemCount() {
return this.sideCount + this.mealCount
}
}
const pizzaOrder = ({size, crustType, topping, quantity}) => {
quantity = Math.round(parseInt(quantity));
count.mealCount += quantity;
if (topping === "") {
console.log(`Order: ${quantity} ${size.toTitleCase()} ${crustType.toLowerCase()} crust plain cheese pizza`);
} else {
console.log(`Order: ${quantity} ${size} ${crustType.toLowerCase()} crust ${topping} pizza`);
}
console.log(`Meal Count after ordering ${quantity} pizzas: ${count.mealCount}`);
console.log(`Current item count: ${count.itemCount()}`);
};
console.log(count.itemCount()) // 0
pizzaOrder({size: 'asd', crustType: 'asd', topping: 'asd', quantity: 1})
console.log(count.itemCount()) // 1
正如其他人提到的,你的代码不会那样工作。
希望这对您有所帮助。如果您想保持订单的“状态”,您可能需要使用一个可以在任何需要的地方公开的对象:
const count = {
sideCount: 0,
mealCount: 0,
itemCount() {
return this.sideCount + this.mealCount
}
}
const pizzaOrder = ({size, crustType, topping, quantity}) => {
quantity = Math.round(parseInt(quantity));
count.mealCount += quantity;
if (topping === "") {
console.log(`Order: ${quantity} ${size.toTitleCase()} ${crustType.toLowerCase()} crust plain cheese pizza`);
} else {
console.log(`Order: ${quantity} ${size} ${crustType.toLowerCase()} crust ${topping} pizza`);
}
console.log(`Meal Count after ordering ${quantity} pizzas: ${count.mealCount}`);
console.log(`Current item count: ${count.itemCount()}`);
};
console.log(count.itemCount()) // 0
pizzaOrder({size: 'asd', crustType: 'asd', topping: 'asd', quantity: 1})
console.log(count.itemCount()) // 1
正如其他人提到的,你的代码不会那样工作。
希望这有帮助。我没有在每个函数中添加
mealCount
,而是在对象中返回mealCount
或sideCount
或drinkCount
,如下所示
return {mealCount: quantity};
然后,我在groupOrder()
函数的orders
参数上使用了Array.prototype.reduce()
方法,该函数是您调用的函数,将函数调用数组传递给食品订单,食品订单和价格计算嵌套在其中
let mealCount = orders.reduce((av, cv) => {
if (cv.hasOwnProperty('mealCount')) {
return {mealCount: av.mealCount + cv.mealCount};
}
return {mealCount: av.mealCount + 0};
}, {mealCount: 0}).mealCount;
我没有在每个函数中添加
mealCount
,而是在对象中返回mealCount
或sideCount
或drinkCount
,如下所示
return {mealCount: quantity};
然后,我在groupOrder()
函数的orders
参数上使用了Array.prototype.reduce()
方法,该函数是您调用的函数,将函数调用数组传递给食品订单,食品订单和价格计算嵌套在其中
let mealCount = orders.reduce((av, cv) => {
if (cv.hasOwnProperty('mealCount')) {
return {mealCount: av.mealCount + cv.mealCount};
}
return {mealCount: av.mealCount + 0};
}, {mealCount: 0}).mealCount;
您是否调用了比萨饼订单函数,然后记录了itemCount?是的,我调用了。它显示为0。在JS中没有像引用变量这样的东西,您所要求的是不可能的。制作一个
itemCount()
函数来计算每次调用的总和。您是否调用了pizza order函数,然后记录了itemCount?是的,我有。它显示为0。在JS中没有像引用变量这样的东西,您所要求的是不可能的。制作一个itemCount()
函数来计算每次调用的总和。我还有很多其他函数,比如pizza order。这是否意味着我必须把这条线放在他们每个人身上,还是有工作around@Marvin创建一个函数updateCount
,从每个函数调用:-)您必须(或多或少明确地)每次更改输入值或每次需要输出值时都要重新计算。我还有很多其他函数,比如pizza order。这是否意味着我必须把这条线放在他们每个人身上,还是有工作around@Marvin创建一个函数updateCount
,从每个函数调用:-)每次更改输入值或每次需要输出值时,您都必须(或多或少明确地)重新计算。对于对象,你甚至可以把它变成一个getter属性。它必须是一个方法吗?我可以把它变成一个属性吗?对于一个对象,你甚至可以把它变成一个getter属性。它必须是一个方法吗?我能把它变成财产吗?