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@JaromandaXinput
仍然是未定义的
,恐怕。@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(){}
vsvar 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) {