Uncaught TypeError: .indexOf is not a function

180,419

Solution 1

Basically indexOf() is a method belongs to string(array object also), But while calling the function you are passing a number, try to cast it to a string and pass it.

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+""));

And it is good to do the string conversion inside your function definition,

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

So that the code flow won't break at times when devs forget to pass a string into this function.

Solution 2

Convert timeofday to string to use 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);

Test Here

Solution 2

use toString() to convert to string

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

jsfiddle with toString()

Solution 3

I was getting e.data.indexOf is not a function error, after debugging it, I found that it was actually a TypeError, which meant, indexOf() being a function is applicable to strings, so I typecasted the data like the following and then used the indexOf() method to make it work

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

Not sure if my answer was accurate to the question, but yes shared my opinion as i faced a similar kind of situation.

Share:
180,419
Admin
Author by

Admin

Updated on June 26, 2020

Comments

  • Admin
    Admin over 2 years

    I am new to JavaScript and I'm getting an error as below.

    Uncaught TypeError: time.indexOf is not a function

    Gee, I really thought indexOf() really was a function. Here is a snippet of my code:

        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>