带有对象的Javascript三元运算符

Posted

技术标签:

【中文标题】带有对象的Javascript三元运算符【英文标题】:Javascript ternary operator with object 【发布时间】: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(因为它是一个新条目)。而且它不是一个数组,它是一个可以使用字典/数组类型语法访问成员的对象。 【参考方案1】:

说你有

var foo = ;

让你感到困惑的那一行

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

问问自己

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

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

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


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

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

【讨论】:

以上是关于带有对象的Javascript三元运算符的主要内容,如果未能解决你的问题,请参考以下文章

为啥带有 some 方法的三元运算符会使此语句为假?

是否可以从 javascript 中的条件(三元)运算符中获取这两个值?

带有三元运算符的海象运算符的正确语法是啥?

JavaScript 速记三元运算符

javascript:使用三元运算符的意外评估行为

Python 使用带有 for 循环的三元运算符