0

JavaScriptを介してインポートされたテキストから問題のある文字を削除しようとすると、TypeErrorが発生します。名前は次の行で「null」です。

for ( var i = 0; i < name.length; i++) {

これがコードの関連セクションです-

fixNameToMiniCharset : function (name) {
    if(typeof name == 'undefined') {
        com.synckolab.global.consoleService.logStringMessage("undefined string " + new Error("s").stack);
    }
    var ret = "";
    // avoid double placeholders 
    var placeHolder = false;
    for ( var i = 0; i < name.length; i++) {
        switch (name.charAt(i)) {
        // character replaces... better this way
        case '\u00e4':
        case '\u00e1':
        case '\u00e0':
        case '\u00e2':
        case '\u00e3':
        case '\u00e5':
        case '\u00e6':
            placeHolder = false;
            ret += 'a';
            break;
        case '\u00c4':
        case '\u00c1':
        case '\u00c0':
        case '\u00c2':
        case '\u00c3':
        case '\u00c5':
        case '\u00c6':
            placeHolder = false;
            ret += 'A';
            break;
        case '\u00f6':
        case '\u00f3':
        case '\u00f2':
        case '\u00f4':
        case '\u00f5':
        case '\u00f8':
            placeHolder = false;
            ret += 'o';
            break;
        case '\u00d6':
        case '\u00d3':
        case '\u00d2':
        case '\u00d4':
        case '\u00d5':
        case '\u00D6':
            placeHolder = false;
            ret += 'O';
            break;
        case '\u00fc':
        case '\u00fa':
        case '\u00f9':
        case '\u00fb':
        case '\u0169':
        case '\u0171':
            placeHolder = false;
            ret += 'u';
            break;
        case '\u00dc':
        case '\u00da':
        case '\u00d9':
        case '\u00db':
        case '\u0168':
            placeHolder = false;
            ret += 'U';
            break;
        case '\u00c8':
        case '\u00c9':
        case '\u00ca':
        case '\u00cb':
            placeHolder = false;
            ret += 'E';
            break;
        case '\u00e8':
        case '\u00e9':
        case '\u00ea':
        case '\u00eb':
            placeHolder = false;
            ret += 'e';
            break;
        case '\u00ec':
        case '\u00ed':
        case '\u00ee':
        case '\u00ef':
            placeHolder = false;
            ret += 'i';
            break;
        case '\u00dd':
        case '\u00a5':
            placeHolder = false;
            ret += 'Y';
            break;
        case '\u00c7':
            placeHolder = false;
            ret += 'C';
            break;
        case '\u00e7':
            placeHolder = false;
            ret += 'c';
            break;
        case '\u00fd':
        case '\u00ff':
            placeHolder = false;
            ret += 'y';
            break;
        case '\u00df':
            placeHolder = false;
            ret += 's';
            break;
        case '\u00f1':
            placeHolder = false;
            ret += 'n';
            break;
        case '\u00b2':
            placeHolder = false;
            ret += '2';
            break;
        case '\u00b3':
            placeHolder = false;
            ret += '3';
            break;

        // chars which are no problem just stay
        case '_':
            // make sure to print it only once
            if(!placeHolder) {
                ret += name.charAt(i);
                placeHolder = true;
            }
            break;

        default:
            var c = name.charAt(i);
            if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9')) {
                placeHolder = false;
                ret += c;
            } else {
                if (!placeHolder) {
                    ret += '_';
                    placeHolder = true;
                }
            }
        }
    }
    return ret;
4

2 に答える 2

0

Change these lines:

if(typeof name == 'undefined') {
    com.synckolab.global.consoleService.logStringMessage("undefined string " + new Error("s").stack);
}

to the following:

if(!name) {
    com.synckolab.global.consoleService.logStringMessage("undefined string " + new Error("s").stack);
    return;
}

This will check for empty undefined and other falsy values which will stop your function from working.

于 2012-09-17T13:57:21.917 に答える
0

問題は一見非常に単純です。引数の型をチェックしています。定義されていない場合、関数は実行されません。しかし、JSではnullは未定義ではなく、undefinedはnullではありません。

console.log(typeof null);//object!
console.log(null == undefined);//true
console.log(null === undefined);//false!

したがって、if(if(typeof name == 'undefined'))をすべての偽の値のチェックに置き換えます。

if(!name)
{
    //invalid argument: false, null, 0, '' and undefined
}
//valid args: true, '0', any number, other than 0, strings objects...

または、おそらくあなたの場合は望ましいです:あなたが遊ぶための長さのプロパティを持っているかどうかを確認してください

if (!name || !name.length)
{
    //invalid
}

または、入力が文字列であるかどうかを確認します。

if (typeof name === 'string')
于 2012-09-17T13:59:53.560 に答える