Pregunta ¿Cuál es la diferencia entre String.slice y String.substring?


¿Alguien sabe cuál es la diferencia entre estos dos métodos?

String.slice
String.substring

582
2018-02-11 10:34


origen


Respuestas:


slice() funciona como substring() con algunos comportamientos diferentes.

Syntax: string.slice(start, stop);
Syntax: string.substring(start, stop);

Lo que tienen en común:

  1. Si start igual stop: devuelve una cadena vacía
  2. Si stop se omite: extrae los caracteres al final de la cadena
  3. Si cualquiera de los argumentos es mayor que la longitud de la cadena, se usará la longitud de la cadena en su lugar.

Distinciones de  substring():

  1. Si start > stop, entonces substring intercambiará esos 2 argumentos.
  2. Si alguno de los argumentos es negativo o es NaN, se trata como si fuera 0.

Distinciones de  slice():

  1. Si start > stop, slice() NO cambiará los 2 argumentos.
  2. Si start es negativo: establece char desde el final de la cadena, exactamente como substr() en Firefox. Este comportamiento se observa tanto en Firefox como en IE.
  3. Si stop es negativo: establece detenerse a: string.length – Math.abs(stop) (valor original), excepto limitado a 0 (por lo tanto, Math.max(0, string.length + stop)) como está cubierto en el Especificación ECMA.

Fuente: Arte rudimentario de programación y desarrollo: Javascript: substr () v.s. subcadena ()


652
2018-02-11 10:36



Nota: si tiene prisa y / o busca una respuesta breve, vaya al final de la respuesta y lea las últimas dos líneas. Si no tiene prisa, lea todo.


permítanme comenzar declarando los hechos:

Sintaxis:
string.slice(start,end)
string.substr(start,length)
string.substring(start,end)
Nota 1: slice()==substring()

¿Que hace?
los slice() método extrae partes de una cadena y devuelve las partes extraídas en una nueva cadena.
los substr() método extrae partes de una cadena, comenzando en el carácter en la posición especificada, y devuelve el número especificado de caracteres.
los substring() método extrae partes de una cadena y devuelve las partes extraídas en una nueva cadena.
Nota 2:slice()==substring()

Cambia la cadena original?
slice() No
substr() No
substring() No
Nota 3:slice()==substring()

Usar números negativos como argumento:
slice() selecciona caracteres comenzando desde el final de la cadena
substr()selecciona caracteres comenzando desde el final de la cadena
substring() No se realiza
Nota 3:slice()==substr()==substr()

si el primer argumento es mayor que el segundo:
slice() No se realiza
substr() ya que el Segundo Argumento NO es una posición, sino un valor de longitud, funcionará como de costumbre, sin problemas
substring() intercambiará los dos argumentos y actuará como de costumbre

el primer argumento:
slice() Requerido, indica: índice de inicio
substr() Requerido, indica: índice de inicio
substring() Requerido, indica: índice de inicio
Nota n. ° 4:slice()==substr()==substring()

el segundo argumento:
slice() Opcional, la posición (hasta, pero sin incluir) dónde finalizar la extracción
substr() Opcional, la cantidad de caracteres para extraer
substring() Opcional, la posición (hasta, pero sin incluir) dónde finalizar la extracción
Nota n. ° 5:slice()==substring()

¿Qué pasa si el segundo argumento es omitido?
slice() selecciona todos los caracteres desde la posición inicial hasta el final de la cadena
substr() selecciona todos los caracteres desde la posición inicial hasta el final de la cadena
substring() selecciona todos los caracteres desde la posición inicial hasta el final de la cadena
Nota n. ° 6:slice()==substr()==substring()

Entonces, puedes decir que hay una diferencia entre slice() y substr(), mientras substring() es básicamente una copia de slice().

En resumen:
si conoce el índice (el puesto) en el que se detendrá (pero NO incluirá), use slice()
si conoce la longitud de los caracteres a extraer, use substr().


66
2017-08-10 01:58



Ben Nadel ha escrito un buen artículo sobre esto, señala la diferencia en los parámetros para estas funciones:

String.slice( begin [, end ] )
String.substring( from [, to ] )
String.substr( start [, length ] )

También señala que si los parámetros para cortar son negativos, hacen referencia a la cadena desde el final. Substring y substr doesn't.

Aquí está su artículo sobre esto http://www.bennadel.com/blog/2159-using-slice-substring-and-substr-in-javascript.htm


18
2017-12-05 16:11



La única respuesta está bien, pero requiere un poco de lectura. Especialmente con la nueva terminología "detener".

My Go: organizado por diferencias para que sea útil además de la primera respuesta de Daniel arriba:

1) índices negativos La subcadena requiere índices positivos, y establecerá un índice negativo en 0. El índice negativo de Slice significa la posición desde el final de la cadena.

"1234".substring(-2, -1) == "1234".substring(0,0) == ""
"1234".slice(-2, -1) == "1234".slice(2, 3) == "3"

2) Swapping de índices. Subcadena reordenará los índices para hacer que el primer índice sea menor o igual que el segundo índice.

"1234".substring(3,2) == "1234".substring(2,3) == "3"
"1234".slice(3,2) == ""

--------------------------

Comentario general: me parece extraño que el segundo índice sea la posición posterior al último carácter del segmento o subcadena. Esperaría que "1234" .slice (2,2) devuelva "3". Esto justifica la confusión de Andy: esperaría que "1234" .slice (2, -1) devuelva "34". Sí, esto significa que soy nuevo en Javascript. Esto significa también este comportamiento:

"1234".slice(-2, -2) == "", "1234".slice(-2, -1) == "3", "1234".slice(-2, -0) == "" <-- you have to use length or omit the argument to get the 4.
"1234".slice(3, -2) == "", "1234".slice(3, -1) == "", "1234".slice(3, -0) == "" <-- same issue, but seems weirder.

Mi 2c.


9
2018-06-04 14:32



La diferencia entre substring y slice - es cómo funcionan con argumentos negativos y que pasan por alto líneas en el extranjero:

subcadena (inicio, fin)

Los argumentos negativos se interpretan como cero. Los valores demasiado grandes se truncan a la longitud de la cadena:     alerta ("testme" .substring (-2)); // "testme", -2 se convierte en 0

Además, si start> end, los argumentos se intercambian, es decir, la línea de trama retorna entre el inicio y el final:

alert ( "testme" .substring (4, -1)); // "test"
// -1 Becomes 0 -> got substring (4, 0)
// 4> 0, so that the arguments are swapped -> substring (0, 4) = "test"

rebanada

Los valores negativos se miden desde el final de la línea:

alert ( "testme" .slice (-2)); // "me", from the end position 2
alert ( "testme" .slice (1, -1)); // "estm", from the first position to the one at the end.

Es mucho más conveniente que la extraña subcadena lógica.

Valor negativo del primer parámetro compatible con substr en todos los navegadores excepto IE8-.

Si elige uno de estos tres métodos, para usar en la mayoría de las situaciones, será rebanada: argumentos negativos y mantiene y opera de manera más obvia.


9
2018-02-05 14:32



-------------------------------------- Diferencias --------------------------------------

String.prototype.slice

Tratamiento de índices negativos

  • " Si [cualquiera de los argumentos es] negativo, se trata como strLength + [index] dónde strLength es la longitud de la cadena (por ejemplo, si [index] es -3 se trata como strLength - 3) "

Índice inicial mayor que índice final

  • " Si [el índice inicial] es mayor que o igual al [tratamiento del índice final] del [rebanada de cuerda], slice() devuelve una cadena vacía "

    - MDN


String.prototype.substring

Tratamiento de índices negativos

  • " Si cualquiera de los argumentos es [negativo] [...], se trata como si fuera 0. "

Índice inicial mayor que índice final

  • " Si [el índice inicial] es mayor que [el índice final], entonces el
     efecto de substring() es como si los dos argumentos fueran intercambiados; por ejemplo, str.substring(1, 0) == str.substring(0, 1). "

    - MDN

-------------------------------------- Similitudes --------------------------------------

Todo lo demás es lo mismo, creo, que incluye:

  • Si una índice final argumento es undefined, se convierte en la longitud de la cadena.
  • Argumentos que no son números y no pueden ser forzados a que los números se vuelvan 0.

* Lo anterior también es cierto para el substr() método, excepto substr() no tiene un argumento de índice final.

------------------------------------------ Notas ------------------------------------------

String.prototype.substr

[un poco más allá del alcance de la pregunta]

  • String.prototype.substr es muy parecido slice(), especialmente con respecto al tratamiento de números negativos para valores de índice; sin embargo, la diferencia clave es que substr()El segundo argumento no especifica un índice final, sino la longitud de los caracteres que la persona que llama quiere devolver. Baste decir que substr() se comporta de la manera más predecible slice() hace más allá de esa diferencia clave; pasando un negativo length argumento devuelve una cadena vacía con este método.


8
2017-08-01 07:55



La única diferencia entre el método slice y substring es de argumentos

Ambos toman dos argumentos, p. inicio / desde y final / a.

No puede pasar un valor negativo como primer argumento para subcadena método pero para rebanada método para atravesarlo desde el final.

Detalles del argumento del método de corte:

ÁRBITRO: http://www.thesstech.com/javascript/string_slice_method

Argumentos

Índice de comienzo Índice desde donde debe comenzar la división. Si el valor se proporciona en negativo, significa comenzar desde el último. p.ej. -1 para el último personaje. end_index Índice después del final del corte. Si no se proporciona slice, se tomará desde start_index hasta el final de la cadena. En caso de índice de valor negativo se medirá desde el final de la cadena.

Detalles del argumento del método de subcadena:

ÁRBITRO: http://www.thesstech.com/javascript/string_substring_method

Argumentos

de Debe ser un entero no negativo para especificar el índice desde donde debe comenzar la subcadena. a Un entero opcional no negativo para proporcionar un índice antes de qué subcadena debe estar terminada.


2
2018-05-24 13:37