未捕获的类型错误:.indexOf不是一个函数。

30

我刚接触JavaScript,遇到了以下错误

Uncaught TypeError: time.indexOf is not a function

我真的以为indexOf()是一个函数。这是我的一小段代码:

    var timeofday = new Date().getHours() + (new Date().getMinutes()) / 60;
    document.getElementById("oset").innerHTML = timeD2C(timeofday);
</script>


<script>
 function timeD2C(time) { // Converts 11.5 (decimal) to 11:30 (colon)
    var pos = time.indexOf('.');
    var hrs = time.substr(1, pos - 1);
    var min = (time.substr(pos, 2)) * 60;

    if (hrs > 11) {
        hrs = (hrs - 12) + ":" + min + " PM";
    } else {
        hrs += ":" + min + " AM";
    }
    return hrs;
}
</script>

2
这确实是一个函数 - 有效对象的函数 - 这意味着 time 不是一个有效的对象。确保 time 存在,并在 timeD2C 函数调用内记录它。 - Stuart
1
你认为为什么数字会有一个 indexOf 函数? - SLaks
1
你的代码混合了字符串和数字。在执行每个操作时,你需要小心确保使用正确的类型。 - Hoyen
4个回答

33

基本上indexOf()是一个属于字符串(数组对象也是)的方法,但是在调用该函数时,你传递了一个数字,请尝试将其转换为字符串并传递。

document.getElementById("oset").innerHTML = timeD2C(timeofday + "");

 var timeofday = new Date().getHours() + (new Date().getMinutes()) / 60;




 function timeD2C(time) { // Converts 11.5 (decimal) to 11:30 (colon)
    var pos = time.indexOf('.');
    var hrs = time.substr(1, pos - 1);
    var min = (time.substr(pos, 2)) * 60;

    if (hrs > 11) {
        hrs = (hrs - 12) + ":" + min + " PM";
    } else {
        hrs += ":" + min + " AM";
    }
    return hrs;
}
alert(timeD2C(timeofday+""));


最好在函数定义内部进行字符串转换。

function timeD2C(time) { 
  time = time + "";
  var pos = time.indexOf('.');

为了避免开发人员在忘记向此函数传递字符串时,代码流程会中断。

1
将转换为字符串的操作放在函数内部会更好 - 这样,如果它因为某种原因被从其他地方调用时传入了一个数字,它就不会抛出错误。 - CBroe
1
感谢大家的建议。我添加了time=time+"",问题就解决了。JavaScript在处理字符串和数字时非常自由,以至于很容易忘记数字并不总是可以像字符串一样处理。 - TerryO
1
我认为一个清晰的方法是将其转换为字符串,例如 time = String(time) - Umair Malhi
@TerryO,请在此答案可行的情况下接受它。在那之前,这个问题没有被标记为已接受的答案。 - ReinstateMonica3167040

8
将timeofday转换为字符串以使用indexOf
var timeofday = new Date().getHours() + (new Date().getMinutes()) / 60;
console.log(typeof(timeofday)) // for testing will log number
function timeD2C(time) { // Converts 11.5 (decimal) to 11:30 (colon)
    var pos = time.indexOf('.');
    var hrs = time.substr(1, pos - 1);
    var min = (time.substr(pos, 2)) * 60;

    if (hrs > 11) {
        hrs = (hrs - 12) + ":" + min + " PM";
    } else {
        hrs += ":" + min + " AM";
    }
    return hrs;
}
 // "" for typecasting to string
 document.getElementById("oset").innerHTML = timeD2C(""+timeofday);

点击此处进行测试

解决方案2

使用toString()将其转换为字符串

document.getElementById("oset").innerHTML = timeD2C(timeofday.toString());

toString()的jsfiddle代码


6

我遇到了e.data.indexOf 不是一个函数的错误,调试后发现它实际上是一个TypeError(类型错误),这意味着indexOf()是一个适用于字符串的函数,因此我进行了如下的数据类型转换,然后使用indexOf()方法使它正常工作。

e.data.toString().indexOf('<stringToBeMatchedToPosition>')

我不确定我的回答是否准确,但是我分享了我的看法,因为我曾经面临过类似的情况。


完全就是我的问题。对我有用。 - Krish

0

最近我在使用一个基于条件更改函数参数的JavaScript库时遇到了这个错误。

您可以测试对象以查看它是否具有该函数。我只会在您无法控制传递给您的内容的情况下执行此操作。

if( param.indexOf != undefined ) {
   // we have a string or other object that 
   // happens to have a function named indexOf
}

你可以在浏览器控制台中测试这个:

> (3).indexOf == undefined;
true

> "".indexOf == undefined;
false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接