web-dev-qa-db-ja.com

キャッチされないTypeError:.indexOfは関数ではありません

私はJavaScriptを初めて使用し、次のようにerrorを受け取ります。

キャッチされないTypeError:time.indexOfは関数ではありません

うん、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>
21
TerryO

基本的にindexOf()はstringに属するメソッドです(配列オブジェクトも)。しかし、数値を渡す関数を呼び出している間、それを文字列にキャストして渡そうとします。

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('.');

開発者がこの関数に文字列を渡すのを忘れたときにコードフローが中断しないように。

indexOfを使用するには、timeofdayを文字列に変換します

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()を使用してstringに変換します

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

toString()のjsfiddle

5
brk

私は最近、条件に基づいて関数のパラメーターを変更する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
0
Andrew Grothe