¿Qué está causando el error `string.split is not a function`?

110

¿Por qué me estoy poniendo ...

TypeError no detectado: string.split no es una función

... cuando corro ...

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

Eric
fuente
2
document.locationes un objeto. Prueba:var string=document.location.href
Teemu

Respuestas:

212

Cambia esto...

var string = document.location;

a esto...

var string = document.location + '';

Esto se debe a que document.locationes un objeto de ubicación . El valor predeterminado .toString()devuelve la ubicación en forma de cadena, por lo que la concatenación lo activará.


También puedes usar document.URLpara obtener una cadena.

usuario1106925
fuente
57
¿No sería más limpio llamar en toString()lugar de la concatenación hacky?
kapa
2
@ bažmegakapa: Sí, es una cuestión de preferencia. El + ''es un truco bastante común para la coacción cadena, pero algunas personas prefieren el toString()método. No lo consideraría más peligroso que usar el unario +para la conversión de números.
3
Eso es tan feo. Hay parseInt()y parseFloat(). También hay Number(). El +es más corta, por supuesto, pero menos legible para alguien no acostumbrado a hacky código o con menos experiencia.
kapa
el + ''método no cambia nada para mí en el navegador Chrome, pero lo toString()hace.
Martin Schneider
@ MA-Maddin: ¿Lo hiciste my_string + "".split()? Si es así, necesita parens ya que +tiene una precedencia menor que .. Así que así:(my_string + "").split()
66

tal vez

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

asumiendo que quieres la URL actual

chepe263
fuente
12

ejecuta esto

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

tu quieres document.location.toString()odocument.location.href

dstarh
fuente
Gracias. No me di cuenta de que convertí mi var de cadena en objeto. Su solución me dio una idea para revisar mi código.
sg552
7

document.location no es una cuerda.

Probablemente quieras usar document.location.hrefo en su document.location.pathnamelugar.

Denys Séguret
fuente
lol. 4 respuestas (al menos) al mismo tiempo. No debería mirar las preguntas más recientes sobre SO :)
Denys Séguret
0

En clausula si, usar (). Por ejemplo:

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