【问题标题】:Can Boolean value produce number values?布尔值可以产生数值吗?
【发布时间】:2021-08-22 08:39:20
【问题描述】:

我已经为我在处理 JavaScript 数据结构时的一个测验找到了一个解决方案,其中一个对象(命名为游戏)如下所示。

const game = {
  score: '4:0',
  scored: ['Lewandowski', 'Gnarby', 'Lewandowski', 'Hummels'], //Names of players
  date: 'Nov 9th, 2037',
  odds: {
    team1: 1.33,
    x: 3.25,
    team2: 6.5,
  },
};


测验或挑战是:创建一个名为“scorers”的对象,其中包含作为属性得分的球员的姓名,以及作为值的进球数。在这个游戏中,它会是这样的:

{
  Gnarby: 1,
  Hummels: 1,
  Lewandowski: 2
}

我找到了以下解决方案:

let scorers = {};
let arr = Object.values(game.scored);
for(const player of arr) {
   scorers[player] = (scorers[player] || 0) + 1;
}
console.log(scorers);

// {Lewandowski: 2, Gnarby: 1, Hummels: 1}

我的问题是语法scorers[player] = (scorers[player] || 0) + 1;如何为每个玩家属性生成值,尽管它是真或假,以及如何在最后添加1,尽管它是数字类型?如何用简单的语言解释这段代码?

【问题讨论】:

  • 不,它不会产生booleanscorers[player] || 0 将返回 scorers[player] 的值,如果它已经包含在 scorers 对象中,否则返回 0。然后将1 添加到它并重新分配给scorers[player]。因此,它永远是一个数字,而不是一个布尔值
  • 顺便说一句。因为game.scored是一个数组,你可以像for (let player of game.scored)一样直接迭代它,不需要Object.values()
  • const scorers = {}; for (let player of game.scored){ scorers[player] = (scorers[player] || 0) + 1; } console.log(scorers) 值将是 0 或在每次迭代中将考虑添加的值并分配为对象属性的新值。

标签: javascript arrays object


【解决方案1】:

与其他一些语言不同,JavaScript 允许将其他数据类型用于看起来像纯粹的布尔运算符。在这种情况下,JavaScript 会暂时将非布尔值解释为“虚假”或“真实”。

有两种情况:

  • scorers[player] 未定义。在这种情况下,|| 操作数会将该值标识为“假”值,因此将继续计算正确的操作数,即 0。因此,(undefined || 0) 的计算结果为 0。

  • scorers[player] 已定义,并且(对于此程序)它将是一个正数。在这种情况下,|| 操作数会认为它是“真实的”,而不是评估正确的操作数。所以(1 || 0) 的计算结果为 1。

注意:在现代 JavaScript 中,现在更好的做法是在此用例中使用 ?? 运算符而不是 ||

【讨论】:

  • 使用scorers[player] = (scorers[player] ?? 0) + 1; 与使用scorers[player] = (scorers[player] || 0) + 1; 相同,因为属性在定义时必须设置为0。
  • @VishalShukla,是的,在这种情况下它会,但这是更好的做法,因为|| 在定义scorers[player] 时会表现不同,但例如是空字符串。我知道这在这种特殊情况下永远不会发生,但最好使用专门对 undefinednull 做出反应的运算符,而不是对所有“虚假”值做出反应。实际上,在这种特殊情况下,它也适用于虚假值,但在更一般的情况下,它可能会有所不同。 (我没有说它不起作用;-))
  • 无论如何,这回答了你的问题吗?
  • 是的。谢谢。
【解决方案2】:

scorers[player] || 0 语法在 JavaScript 中被称为 short circuit

就像逻辑代数中的AND, OR AND NOT 一样简单。默认情况下,JS Object 中不存在的属性会产生 undefined( 这意味着 Boolean false )。 以下是JS中短路的一些用法。

您的语句scorers[player] = (scorers[player] || 0 将产生 socres[player] 结果(如果存在)或 0。当您确实将 1 添加到它时,它将增加当前玩家的目标计数。这将导致玩家当前得分为 0 或 +1。该语句中涉及的每个步骤如下所示。

【讨论】:

  • 对不起,我们can't accept images of code, data or errors。将它们发布为 text,以便其他人可以尝试复制十分之一的输出,而无需重新输入所有内容,并且屏幕阅读器可以正确索引或阅读您的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
  • 2012-02-13
相关资源
最近更新 更多