O que está causando o erro `string.split não é uma função`?

110

Por que estou recebendo ...

TypeError não capturado: string.split não é uma função

... quando eu corro ...

var string = document.location;
var split = string.split('/');

Eric
fonte
2
document.locationé um objeto. Experimente:var string=document.location.href
Teemu

Respostas:

212

Mude isso...

var string = document.location;

para isso...

var string = document.location + '';

Isso ocorre porque document.locationé um objeto Location . O padrão .toString()retorna o local em formato de string, então a concatenação irá acionar isso.


Você também pode usar document.URLpara obter uma string.

user1106925
fonte
57
Não seria mais limpo chamar em toString()vez de concatenação hacky?
kapa
2
@ bažmegakapa: Sim, é uma questão de preferência. Este + ''é um truque bastante comum para coerção de strings, mas algumas pessoas preferem o toString()método. Eu não consideraria isso mais hacky do que usar o unário +para conversão de número.
3
Isso é tão feio. Existe parseInt()e parseFloat(). Existe também Number(). O +é mais curto, é claro, mas menos legível para alguém não acostumado a códigos hacky ou menos experiente.
kapa de
o + ''método não muda nada para mim no navegador Chrome, mas muda toString().
Martin Schneider
@ MA-Maddin: Você fez my_string + "".split()? Nesse caso, você precisa de parênteses, pois +tem uma precedência menor que .. Assim:(my_string + "").split()
66

talvez

string = document.location.href;
arrayOfStrings = string.toString().split('/');

presumindo que você deseja o url atual

chepe263
fonte
12

Rode isto

// you'll see that it prints Object
console.log(typeof document.location);

você quer document.location.toString()oudocument.location.href

dstarh
fonte
Obrigado. Não percebi que converti meu var de string para objeto. Sua solução me deu uma ideia para verificar meu código.
sg552
7

document.location não é uma string.

Você provavelmente está querendo usar document.location.hrefou em document.location.pathnamevez disso.

Denys Séguret
fonte
ri muito. 4 respostas (pelo menos) ao mesmo tempo. Eu não deveria olhar para as perguntas mais recentes no SO :)
Denys Séguret
0

Na cláusula if, use (). Por exemplo:

stringtorray = "xxxx,yyyyy,zzzzz";
if (xxx && (stringtoarray.split(',') + "")) { ...
Jonatas AstroPt
fonte