Javascript 字数计数功能正在拾取&引用;作为一个可行的词?

Javascript 字数计数功能正在拾取&引用;作为一个可行的词?,javascript,object,Javascript,Object,我已经编写了一个基本函数来计算字符串中的单词频率。首先,我将字符串拆分为一个数组,然后通过for循环遍历单词数组。也就是说,如果初始字符串为空(“”),我的函数将把“”视为单词,因此结果是{“”:1},而不是空对象。我最初认为,由于for循环,空字符串根本不会注册 我已经在函数开始时通过if条件解决了这个问题,但是我想知道是否有更好的方法来解决这个问题 function countWords(str) { if (str === "") { return {}; } v

我已经编写了一个基本函数来计算字符串中的单词频率。首先,我将字符串拆分为一个数组,然后通过for循环遍历单词数组。也就是说,如果初始字符串为空(“”),我的函数将把“”视为单词,因此结果是{“”:1},而不是空对象。我最初认为,由于for循环,空字符串根本不会注册

我已经在函数开始时通过if条件解决了这个问题,但是我想知道是否有更好的方法来解决这个问题

function countWords(str) {
  if (str === "") {
    return {};  
  }

  var counts = {};
  var wordArray = str.split(" ");
  for (i=0;i < wordArray.length; i++) {

    word = wordArray[i];
    if (!counts[word]) {
      counts[word] = 1;
    } else {
      counts[word] += 1;   
    }
  }
return counts;
}
函数countWords(str){
如果(str==“”){
返回{};
}
变量计数={};
var wordArray=str.split(“”);
对于(i=0;i
我的Ruby代码等价物不需要任何东西就可以不将空字符串作为可行的单词目标,所以这让我有些困扰


编辑:谢谢你的回复。我感谢所有的帮助

取决于具体情况,但如果在您的情况下仅将字符串作为参数传递,则检查就足够了

如果存在
未定义
或其他作为参数传递的可能性,您可以改为执行此检查:

if (!str) {
   return {};
}
如果您想要更严格的检查,您可以:

if (!str || typeof str !== 'string') {
   return {};
}

在本例中,您正在检查falsy值(正如我们在上面看到的,空字符串是一个falsy值),并确保您得到的是一个字符串作为参数。

这是预期的行为
.split()
不保证结果中有非空字符串。除非明确过滤掉空字符串,否则
.split()
返回的所有空字符串都将被计数


由于
.split
不会合并顺序拆分字符串,因此拆分后可能会有很多空字符串:请尝试
“a b c”.split(“”)

我在这里没有看到任何问题。我在最初的提示中没有问这个问题,但我也想知道为什么我甚至需要首先检查。我的意思是,单看for循环,我认为它根本不会运行,因为I=0,array.length=0.Oh。我现在明白了。因为我在数组中注册了它。如果您尝试对非字符串的内容执行
拆分
,它将失败,因此根据具体情况进行检查可能会很好。我自己在玩了一点代码后得出了这个结论。永远不会少,谢谢你的投入。我需要更加努力地审视自己的工作。只是觉得Javascript与Ruby相比,对初学者的友好程度有所下降。没问题。此外,它通常有助于(我)在节点repl/browser console/jsfiddle中处理小代码片段,以了解它们如何与不同的inout一起工作。