【问题标题】:Javascript ternary operator with object带有对象的Javascript三元运算符
【发布时间】:2015-01-22 15:59:46
【问题描述】:

我遇到了一段我想弄清楚的代码,该代码基本上存储了一个单词在文本文档中出现的时间量,所以函数 countWordsIntext 接受所需的文本并显示文本中的单词和出现次数, 例如 会:3 但是:5 非常:6

在查看计算文本中单词的函数时,我无法弄清楚条件三元运算应该如何工作。非常感谢您的解释

var wordCounts = {};

 function countWordsInText(text) {
    var words = text.toString()
                .toLowerCase()
                .split(/\W+)
                .sort();
    for(var index in words) {
    var word = words[index];
    if(word) {
     wordCounts[word] =
        (wordCounts[word]) ? wordCounts[word] + 1 : 1;
       }
   }
} 

function display()
{
  for (var index in wordCounts)
   console.log(index + ': ' + wordCounts[index]);
}

我不明白wordCounts[word] 对象属性是如何更新的。

【问题讨论】:

  • 这个代码? wordCounts[word] =.... 也许换行符让你感到困惑。如果 wordCounts[word] 存在,则将其递增,否则将其设置为 1(因为它是一个新条目)。而且它不是一个数组,它是一个可以使用字典/数组类型语法访问成员的对象。

标签: javascript arrays conditional-operator


【解决方案1】:

说你有

var foo = {};

让你感到困惑的那一行

foo.bar = foo.bar ? foo.bar + 1 : 1; // line A

问问自己

  1. 开头的foo.bar 是什么?它是未定义,我们没有给foo 一个属性bar
  2. 第一次执行 A 行后,foo.bar 是什么?是1foo.barundefined 这是 falsy 所以三元运算符返回给我们1
  3. 第二条时间线A执行后foo.bar是什么?是2foo.bar1,这是 truthy,所以三元运算符返回了 foo.bar + 1

可以重复 A 行,直到你的数字用完或世界爆炸

这样写是解决undefined + 1问题的一种方法,它会给出NaN


一个同样有效的解决方案(我觉得个人阅读更清晰)是这样做

foo.bar = (foo.bar || 0) + 1;

【讨论】:

    猜你喜欢
    • 2021-12-07
    • 1970-01-01
    • 2020-05-21
    • 2019-07-21
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多