Quelle est la cause de l'erreur `string.split is not a function`?

110

Pourquoi est-ce que je reçois ...

Uncaught TypeError: string.split n'est pas une fonction

... quand je cours ...

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

Eric
la source
2
document.locationest un objet. Essayez:var string=document.location.href
Teemu

Réponses:

213

Change ça...

var string = document.location;

pour ça...

var string = document.location + '';

C'est parce qu'il document.locations'agit d'un objet Location . La valeur par défaut .toString()renvoie l'emplacement sous forme de chaîne, donc la concaténation le déclenchera.


Vous pouvez également utiliser document.URLpour obtenir une chaîne.

user1106925
la source
57
Ne serait-il pas plus propre d'appeler toString()au lieu d'une concaténation hacky?
kapa
2
@ bažmegakapa: Ouais, c'est une question de préférence. Le + ''est une astuce assez courante pour la coercition de chaînes, mais certaines personnes préfèrent la toString()méthode. Je ne le considérerais pas plus piraté que d'utiliser l'unaire +pour la conversion de nombres.
3
C'est tout aussi moche. Il y a parseInt()et parseFloat(). Il y a aussi Number(). Le +est plus court bien sûr, mais moins lisible pour quelqu'un qui n'a pas l'habitude de pirater du code ou qui est moins expérimenté.
kapa
la + ''méthode ne change rien pour moi dans le navigateur Chrome, mais le toString()fait.
Martin Schneider
@ MA-Maddin: Avez-vous fait my_string + "".split()? Si tel est le cas, vous avez besoin de parenthèses car +a une priorité inférieure à .. Donc, comme ça:(my_string + "").split()
67

peut être

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

en supposant que vous vouliez l'URL actuelle

chepe263
la source
12

lance ça

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

tu veux document.location.toString()oudocument.location.href

dstarh
la source
Je vous remercie. Je n'avais pas réalisé que j'avais converti ma variable de chaîne en objet. Votre solution m'a donné une idée pour vérifier mon code.
sg552
7

document.location n'est pas une chaîne.

Vous souhaitez probablement utiliser document.location.hrefou à la document.location.pathnameplace.

Denys Séguret
la source
lol. 4 réponses (au moins) en même temps. Je ne devrais pas regarder les dernières questions sur SO :)
Denys Séguret
0

En clausule si, utilisez (). Par exemple:

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