2012-09-17 19 views
0

在試圖從通過JavaScript導入的文本刪除有問題的字符時的名稱爲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; 

回答

0

問題很簡單,乍一看:您正在檢查參數的類型:如果它未定義,您的函數將無法運行。但是在JS中,null不是未定義的,undefined不是null。

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

因此,要麼更換你的,如果(if(typeof name == 'undefined'))通過對所有falsy值的檢查:

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

或者,也許在你的情況下,優選:請檢查您是否已經有了一個length屬性一起玩

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

OR檢查,看是否輸入的字符串:

if (typeof name === 'string') 
+0

我應該提到,我最初使用,如果(!名)具有相同的結果 – user1514992

+0

當然,如果一個對象傳遞,一點不有一個長度屬性,你會得到一個錯誤:一個對象不是一個虛假值,但這並不意味着有一個長度屬性。這就是爲什麼我建議檢查'!name || !name.length' < - - 不具有length屬性的falsy值或值。順便說一句:我注意到你還沒有接受答案。如果你沒有答案,人們往往不會在一段時間後回答你的問題......只是一個友善的勸告詞:P –

+1

謝謝。我沒有注意到巨大的複選標記!你的解決方案大多是有效的 - 我想我在其他地方遇到了其他問題。這是一個Thunderbird插件來同步聯繫人。如果我不使用默認的聯繫人文件夾,我可以使用修補程序正常工作。與默認文件夾(這應該工作),我仍然得到相同的錯誤。 – user1514992

0

更改這些行:

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

以下:

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

這將檢查空的未定義和其他falsy值,這將停止您的功能工作。

+0

這確實讓物體,它不必有length屬性 –