javascript-indexOf不是一个函数

javascript-indexOf不是一个函数,javascript,Javascript,我有这个活动 <textarea id="chat"> </textarea> <button type="button" onclick="play_song();">talk</button> 还有这个函数: var input = function() { var chat = document.getElementById("chat").value.split(" "); r

我有这个活动

   <textarea id="chat"> </textarea>
   <button type="button" onclick="play_song();">talk</button>
还有这个
函数

   var input = function() {
           var chat = document.getElementById("chat").value.split(" ");
           return chat && console.log(chat);
        }
   function setIntersection(a, b) {

      var result = [];

      for (var i = 0; i < a.length; i++) {
         if (b.indexOf(a[i]) !== -1 && result.indexOf(a[i]) === -1) {
            result.push(a[i]);
         }
      }
    return result;
   }
   Song.prototype.lyricsIntersect = function(input) {


      var bestSong = null;
      var bestCount = -Infinity;

      for (var i in songs) {
        var currentCount = setIntersection(songs[i].lyrics, input).length;

    if (currentCount > bestCount) {
        bestSong = songs[i];
        bestCount = currentCount;
    }
}

return bestSong && bestSong.name;
}
代码在这里结束:

   function play_song() {

    var id = Song.prototype.lyricsIntersect(input);
    var element = document.getElementById(id);
    element.play();
}
但是
console.log
返回:
uncaughttypeerror:b.indexOf不是函数

如果我测试
var输入=[“一”,“二],但是,根据
输入
,我可以在代码上完成交集


我缺少什么?

要使用
Array
对象的
indexOf
函数,则
b
变量必须是
Array
。检查您的
b
类型

下面是函数

编辑:


根据您提供的信息,您的
b
似乎是对
输入的引用。您需要确保
输入
是一个
数组
。在您提供的情况下<代码>输入实际上是一个函数,而不是一个数组。请尽量简化示例,您的函数(如前所述)没有使用预期参数调用(可能是错误的逻辑)。至于
indexOf
方法:

typeof [].indexOf // "function"

typeof ''.indexOf // "function"
实现的任何数据类型都应支持
indexOf

var currentCount = setIntersection(songs[i].lyrics, input).length;
应该是

var currentCount = setIntersection(songs[i].lyrics, input()).length;
这还取决于输入的更正,如下所示

var input = function() {
   var chat = document.getElementById("chat").value.split(" ");
   return chat;
}
我错过了什么

在这里,您将输入声明为全局输入并分配函数:

var input = function() {
    var chat = document.getElementById("chat").value.split(" ");
    return chat && console.log(chat);
}
我更喜欢函数声明,但每个声明都有自己的声明

这里您将输入作为参数传递给Song.prototype.lyricsIntersect

将其分配给自己的变量输入:

然后调用setIntersection:

然后在setIntersection中,它被指定给b参数:

function setIntersection(a, b) {
并被视为一个数组:

     if (b.indexOf(a[i]) !== -1 && result.indexOf(a[i]) === -1) {

b是什么?可能您的设置错误HTML和
输入
函数与问题的关系如何?相反,您应该发布如何调用
setcrossion
。注意:
returnchat&&console.log(chat)返回未定义,因为这是console.log的返回值。您正在将输入作为b参数传递。输入是一个函数。我想这比我的答案要好。这将使您的b成为一个数组,因此不会引发TypeError问题。@RobG只要更改输入以按预期返回数组,它就会工作-请参阅编辑answer@JaromandaX
input
仍然是
未定义的
,恐怕。@JaromandaX我忘了运行
input()。现在它不再是未定义的了,它可以工作了@罗布很有名。不过,它还没有在所有浏览器上实现?@Grimbode是的
console.log
返回一个
array
@Grimbode,如果“it”是指array.prototype.indexOf,那么它是在ES5中引入的,所以应该在除IE8之外的所有浏览器中使用。如果你指的是ECMA-262 ed 6,我认为还没有任何浏览器完全实现了它,但大多数新浏览器都实现了大部分。我引用了ECMA-262第6版,因为它已经成为标准一个多月了。ES5为4岁@RobG I认为
声明函数
输入设置为
全局变量
,作为
参数在其他
函数
中传递。考虑到我需要一个
数组
,您将如何使用
函数声明
?函数声明实际上也是函数名的变量声明。唯一真正的区别是,它们是在执行任何代码之前处理的,而对于带有赋值的变量声明,虽然声明发生在执行之前,但赋值仅在执行该行代码时发生。这里肯定有很多关于
function name(){}
vs
var name=function(){}
@RobG的问题,我明白了,函数声明是在脚本解析时处理的,不是在运行时处理的,是吗?因此,对于函数声明,我不需要添加这一行
input()在使用赋值进行变量声明后(声明变量输入后我需要执行此操作)?@data\u-yes。因为函数声明是在执行之前处理的,所以您可以在最底层声明函数,并在最顶层调用它。赋值不是这样,它们必须在赋值后调用。要使用函数声明,只需执行
function returnChat(){…}
,然后执行
var input=returnChat()
。这样做要好得多,因为1)如前所述,函数将运行并在页面加载上有一个值,并等待您的行调用它,而无需进行循环。2) 无需在全球范围内申报。您只需创建函数并调用它。3) 在C#中,您通常必须知道要传递的变量的类型。您不希望将匿名函数分配给变量&不知道它,而是声明它们的类型。最好习惯这样做。
    var currentCount = setIntersection(songs[i].lyrics, input).length;
function setIntersection(a, b) {
     if (b.indexOf(a[i]) !== -1 && result.indexOf(a[i]) === -1) {