A primeira solução não funciona para nenhum alfabeto UTF-8. (Ele cortará texto como Їжак). Eu consegui criar uma função que não usa RegExp e usa bom suporte a UTF-8 no mecanismo JavaScript. A ideia é simples se um símbolo é igual em maiúsculas e minúsculas, é um caractere especial. A única exceção é feita para espaços em branco.
function removeSpecials(str) {
var lower = str.toLowerCase();
var upper = str.toUpperCase();
var res = "";
for(var i=0; i<lower.length; ++i) {
if(lower[i] != upper[i] || lower[i].trim() === '')
res += str[i];
}
return res;
}
Atualização: observe que esta solução funciona apenas para idiomas em que há letras maiúsculas e minúsculas. Em idiomas como o chinês, isso não vai funcionar.
Atualização 2: cheguei à solução original quando estava trabalhando em uma pesquisa difusa. Se você também estiver tentando remover caracteres especiais para implementar a funcionalidade de pesquisa, existe uma abordagem melhor. Use qualquer biblioteca de transliteração que produza uma sequência apenas de caracteres latinos e, em seguida, o Regexp simples fará toda a mágica de remover caracteres especiais. (Isso funcionará também para os chineses e você também receberá benefícios colaterais ao fazer Tromsø
== Tromso
).