¿Cuál es la diferencia entre substr y substring?

844

Cuál es la diferencia entre

alert("abc".substr(0,2));

y

alert("abc".substring(0,2));

Ambos parecen dar salida a "ab".

Motor de diferencia
fuente
13
@Derek 朕 會 功夫 Nota, últimamente substring supera a todos los demás en Chrome .
Steven Lu
44
Agregando al comentario @Derek ... A diferencia del slicemétodo, substringno maneja el ajuste para parámetros negativos.
Dzeimsas Zvirblis
1
Creo que la pregunta más importante es "¿por qué JavaScript tiene un substrmétodo y un substringmétodo"? Este es realmente el método preferido de sobrecarga?
Sinjai
77
A partir de hoy, MDN tiene una gran advertencia roja sobre substr()ser lo que podríamos llamar "pseudo-obsoleto" en la parte superior de la página de documentos aquí: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - ¿Alguien tiene más información sobre esto, por ejemplo, ¿hay algún navegador que planee desaprobar substr()en algún momento en el futuro? O como sugirió Steven Lu, ¿podría haber desventajas de rendimiento al usar substr()en el futuro?
James

Respuestas:

930

La diferencia está en el segundo argumento. El segundo argumento para substringes el índice para detenerse en (pero no incluir), pero el segundo argumento para substres la longitud máxima a devolver.

¿Enlaces?

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/substr

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/substring

Delan Azabani
fuente
61
Suena como una fuente común de error. Es bueno saber la diferencia. Encontré comentarios adicionales sobre esto aquí: rapd.wordpress.com/2007/07/12/javascript-substr-vs-substring
schnaader
3
@Pawel también cuando lo quieres hasta el final de la cadena (sin segundo argumento)
André Chalella
Esto es tan ridículo que casi echo de menos los días de desarrollo de applets de Java. ('Casi', porque teníamos que preocuparnos por IE en ese entonces.)
Michael Scheper
2
También debe mencionar la diferencia en el primer argumento, que puede ser negativo para substr (en cuyo caso comienza desde el final), pero no para substring. Vea la respuesta de JefferMC, pero tiene tantos votos menos que mucha gente podría perderse esta parte importante.
youen
2
Como esta es la respuesta más votada, probablemente debería editarse para incluir la que String.prototype.substr()está en desuso ... (Se define en el Anexo B del estándar ECMA-262, cuya introducción establece: "... Los programadores no deben usar o asumir el existencia de estas características y comportamientos al escribir nuevo código ECMAScript ... ")
TS
309

substring( MDN ) toma los parámetros como (from, to).
substr( MDN ) toma los parámetros como (from, length).

Actualización : MDN considera substrlegado.

alert("abc".substr(1,2)); // returns "bc"
alert("abc".substring(1,2)); // returns "b"

Puede recordar que substringtoma índices, al igual que otro método de extracción de cadenas, el corte .

Al comenzar desde 0 puede usar cualquiera de los métodos.

Colin Hebert
fuente
140
.substring()toma índices Puedes recordarlo porque es el único con una 'i' en el nombre. .slice()toma índices también.
Colllin
10
@colllin, ¡ese comentario sobre las i y las indicaciones seguramente debería trasladarse a la respuesta!
MyDaftQuestions
35

Como se insinuó en la respuesta de yatima2975, hay una diferencia adicional:

substr()acepta una posición de inicio negativa como un desplazamiento desde el final de la cadena. substring()no.

De MDN :

Si start es negativo, substr () lo usa como índice de caracteres desde el final de la cadena.

Para resumir las diferencias funcionales:

substring(begin-offset, end-offset-exclusive)donde begin-offset es 0o mayor

substr(begin-offset, length) donde begin-offset también puede ser negativo

JefferMC
fuente
25

Otro problema que encontré recientemente es que en IE 8, "abcd".substr(-1)retorna erróneamente "abcd", mientras que Firefox 3.6 regresa "d"como debería. sliceFunciona correctamente en ambos.

Más sobre este tema se puede encontrar aquí .

yatima2975
fuente
17

La principal diferencia es que

substr () le permite especificar la longitud máxima a devolver

substring () le permite especificar los índices y el segundo argumento NO incluye

Hay algunas sutilezas adicionales entre substr () y substring (), como el manejo de argumentos iguales y argumentos negativos. También tenga en cuenta que substring () y slice () son similares pero no siempre iguales.

  //*** length vs indices:
    "string".substring(2,4);  // "ri"   (start, end) indices / second value is NOT inclusive
    "string".substr(2,4);     // "ring" (start, length) length is the maximum length to return
    "string".slice(2,4);      // "ri"   (start, end) indices / second value is NOT inclusive

  //*** watch out for substring swap:
    "string".substring(3,2);  // "r"    (swaps the larger and the smaller number)
    "string".substr(3,2);     // "in"
    "string".slice(3,2);      // ""     (just returns "")

  //*** negative second argument:
    "string".substring(2,-4); // "st"   (converts negative numbers to 0, then swaps first and second position)
    "string".substr(2,-4);    // ""
    "string".slice(2,-4);     // ""

  //*** negative first argument:
    "string".substring(-3);   // "string"        
    "string".substr(-3);      // "ing"  (read from end of string)
    "string".slice(-3);       // "ing"        
Nate Lipp
fuente
Te perdiste el útil "segundo argumento negativo" para slice:"string".slice(2,-2); // "ri"
Paul
8

La diferencia es el segundo parámetro. Sus segundos parámetros, aunque ambos números, esperan dos cosas diferentes:

Cuando se usa la subcadena, el segundo parámetro es el primer índice que no incluye:

var s = "string";
s.substring(1, 3); // would return 'tr'

var s = "another example";
s.substring(3, 7); // would return 'ther'

Cuando se usa substr, el segundo parámetro es el número de caracteres que se incluirán en la subcadena:

var s = "string";
s.substr(1, 3); // would return 'tri'

var s = "another example";
s.substr(3, 7); // would return 'ther ex'
CurnalCurz
fuente
5

La gran diferencia es que substr()es un método obsoleto que todavía se puede usar, pero se debe usar con precaución porque se espera que se elimine por completo en algún momento en el futuro. Debería trabajar para eliminar su uso de su código. Y el substring()método tuvo éxito y especificó el anterior.

5viente
fuente
2
¿Puede señalar una fuente confiable que indique la depreciación de substr()? Lo he leído de varias personas, pero no puedo encontrar ninguna información en la web que respalde la declaración. Además, Mozilla no lo incluye en la lista de características obsoletas / obsoletas: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
DanielM
@DanielM Por lo que recuerdo, quedó en desuso cuando publiqué esta respuesta, tal vez el artículo cambió y ahora no está en desuso (pero no estoy seguro) . Pero aún está registrado en algunos artículos como en sstut.com/javascript/substring- method.php como obsoleto.
5vier
3
@DanielM String.prototype.substr()se define en el Anexo B del estándar ECMA-262, cuya introducción establece: "... Los programadores no deben usar o asumir la existencia de estas características y comportamientos al escribir un nuevo código ECMAScript ..."
TS
@TS substr()realmente se nota como obsoleto en algunos documentos.
5vier
2
Esta debería ser una respuesta aceptada a partir de hoy. Usar funciones heredadas cuando hay una alternativa no es una opción para un buen código. Vota esta respuesta para que sea más visible a medida que Google conduce a esta página.
vbezhenar
4

Slice vs Substr vs Substring vs [] Métodos

Hay beneficios de rendimiento para cada uno de estos métodos de JavaScript. Utilice estas funciones en consecuencia.

Ali007
fuente
99
Esta respuesta sería mejor si incluyera aquí un resumen del texto sobre los resultados de los beneficios de rendimiento vinculados, por favor.
2540625
3

substring (): tiene 2 parámetros "inicio" y "fin".

  • comienzo parámetro de es obligatorio y especifica la posición donde comenzar la extracción.
  • El parámetro final es opcional y especifica la posición donde debe finalizar la extracción.

Si no se especifica el parámetro final, se extraen todos los caracteres desde la posición inicial hasta el final de la cadena.

var str = "Substring Example";
var result = str.substring(0, 10);
alert(result);

Output : Substring

Si el valor del parámetro de inicio es mayor que el valor del parámetro de finalización, este método intercambiará los dos argumentos. Esto significa que start se usará como end y end se usará como start.

var str = "Substring Example";
var result = str.substring(10, 0);
alert(result);

Output : Substring

substr () : tiene 2 parámetros "inicio" y "cuenta".

  • El parámetro de inicio es obligatorio y especifica la posición donde comenzar la extracción.

  • El parámetro count es opcional y especifica el número de caracteres a extraer.

var str = "Substr Example";
var result = str.substr(0, 10);
alert(result);


Output : Substr Exa

Si no se especifica el parámetro de conteo, se extraen todos los caracteres desde la posición inicial hasta el final de la cadena. Si count es 0 o negativo, se devuelve una cadena vacía.

var str = "Substr Example";
var result = str.substr(11);
alert(result);

Output : ple

raju poloju
fuente
2

subcadena (startIndex, endIndex (no incluido))

substr (startIndex, cuántos caracteres)

const string = 'JavaScript';

console.log('substring(1,2)', string.substring(1,2)); // a
console.log('substr(1,2)', string.substr(1,2)); // av
Sajith Mantharath
fuente