Qual è la differenza tra substr e substring?


844

Qual è la differenza tra

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

e

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

Entrambi sembrano produrre "ab".


13
@Derek 朕 會 功夫 Nota, substring supera di recente tutti gli altri su Chrome .
Steven Lu,

4
Aggiunta al commento @Derek ... A differenza del slicemetodo, substringnon gestisce la regolazione per i parametri negativi.
Dzeimsas Zvirblis,

1
Penso che la domanda più importante sia "perché JavaScript ha sia un substrmetodo che un substringmetodo"? Questo è davvero il metodo preferito di sovraccarico?
Sinjai,

7
Ad oggi, MDN ha un grande avvertimento rosso substr()sull'essere quello che potresti chiamare "pseudo-deprecato" nella parte superiore della pagina dei documenti qui: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - Qualcuno ha più informazioni su questo, ad esempio c'è qualche browser che sta pianificando di deprecarsi substr()in qualsiasi momento in futuro? O come ha suggerito Steven Lu, potrebbero esserci degli svantaggi prestazionali nell'uso substr()in futuro?
Jamess,

Risposte:


930

La differenza sta nel secondo argomento. Il secondo argomento a substringè l'indice a cui fermarsi (ma non includere), ma il secondo argomento a substrè la lunghezza massima da restituire.

Link?

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

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


61
Sembra una fonte comune di errore. Buono a sapersi la differenza. Ho trovato ulteriori commenti a riguardo qui: rapd.wordpress.com/2007/07/12/javascript-substr-vs-substring
schnaader

3
@Pawel anche quando lo vuoi fino alla fine della stringa (nessun secondo argomento)
André Chalella,

Questo è così ridicolo che quasi mi mancano i giorni dello sviluppo di applet Java. ("Quasi", perché all'epoca dovevamo preoccuparci di IE.)
Michael Scheper,

2
Dovresti anche menzionare la differenza sul primo argomento, che può essere negativo per substr (nel qual caso inizia dalla fine), ma non per sottostringa. Vedi la risposta di JefferMC, ma ha così tanti voti in meno che molte persone potrebbero perdere questa parte importante.
Youen

2
Poiché questa è la risposta di gran lunga più votata, dovrebbe probabilmente essere modificata per includere quella che String.prototype.substr()è deprecata ... (È definita nell'allegato B della norma ECMA-262, la cui introduzione afferma: "... I programmatori non dovrebbero usare o assumere il esistenza di queste caratteristiche e comportamenti quando si scrive un nuovo codice ECMAScript. ... ")
TS

309

substring( MDN ) accetta parametri come (from, to).
substr( MDN ) accetta parametri come (from, length).

Aggiornamento : MDN considera substrlegacy.

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

Puoi ricordare che substringprende gli indici, così come l'ennesimo metodo di estrazione delle stringhe, slice .

A partire da 0 è possibile utilizzare entrambi i metodi.


140
.substring()prende indici. Puoi ricordare perché è l'unico con una "i" nel nome. .slice()prende anche gli indici.
Colllin,

10
@colllin, quel commento sull'i e le indicazioni sicuramente dovrebbe essere spostato nella risposta!
MyDaftQuestions,

35

Come accennato nella risposta di yatima2975, c'è un'ulteriore differenza:

substr()accetta una posizione iniziale negativa come offset dalla fine della stringa. substring()non.

Da MDN :

Se start è negativo, substr () lo utilizza come indice di caratteri dalla fine della stringa.

Quindi, per riassumere le differenze funzionali:

substring(begin-offset, end-offset-exclusive)dove start-offset è 0o maggiore

substr(begin-offset, length) dove inizio-offset può anche essere negativo


25

Un altro gotcha che mi sono imbattuto di recente è che in IE 8, "abcd".substr(-1)ritorna erroneamente "abcd", mentre Firefox 3.6 ritorna "d"come dovrebbe. slicefunziona correttamente su entrambi.

Maggiori informazioni su questo argomento sono disponibili qui .


17

La differenza principale è quella

substr () consente di specificare la lunghezza massima da restituire

substring () consente di specificare gli indici e il secondo argomento NON è inclusivo

Ci sono alcune sottigliezze aggiuntive tra substr () e substring () come la gestione di argomenti uguali e argomenti negativi. Nota anche che la sottostringa () e la slice () sono simili ma non sempre uguali.

  //*** 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"        

Hai perso l'utile "secondo argomento negativo" per slice:"string".slice(2,-2); // "ri"
Paolo

8

La differenza è il secondo parametro. I loro secondi parametri, mentre entrambi i numeri, si aspettano due cose diverse:

Quando si utilizza la sottostringa, il secondo parametro è il primo indice da non includere:

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

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

Quando si utilizza substr il secondo parametro è il numero di caratteri da includere nella sottostringa:

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

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

5

La grande differenza è che substr()è un metodo deprecato che può ancora essere usato, ma dovrebbe essere usato con cautela perché si prevede che vengano rimossi completamente in futuro. Dovresti lavorare per rimuovere il loro uso dal tuo codice. E il substring()metodo è riuscito e ha specificato quello precedente.


2
Puoi indicare una fonte affidabile che indica il deprezzamento di substr()? L'ho letto da diverse persone, ma non riesco a trovare alcuna informazione sul web che supporti l'affermazione. Inoltre, Mozilla non lo include nell'elenco di funzionalità obsolete / obsolete: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
DanielM,

@DanielM Per quanto mi ricordo, è stato deprecato quando inserisco questa risposta, forse l'articolo è cambiato e ora non è deprecato (ma non sono sicuro) .. Ma ancora registrato su alcuni articoli come in sstut.com/javascript/substring- method.php come deprecato.
5

3
@DanielM String.prototype.substr()è definito nell'allegato B della norma ECMA-262, la cui introduzione afferma: "... I programmatori non dovrebbero usare o assumere l'esistenza di queste caratteristiche e comportamenti quando scrivono un nuovo codice ECMAScript ..."
TS

@TS substr()è davvero considerato deprecato in alcuni documenti.
5

2
Questa dovrebbe essere una risposta accettata a partire da oggi. L'uso di funzioni legacy quando esiste un'alternativa non è un'opzione per un buon codice. Per favore vota questa risposta per renderla più visibile mentre Google conduce a questa pagina.
vbezhenar,

4

Metodi Slice vs Substr vs Substring vs []

Ci sono benefici prestazionali in ciascuno di questi metodi javascript. Si prega di utilizzare queste funzioni di conseguenza.


9
Questa risposta sarebbe migliore se includesse un testo di sintesi qui per quanto riguarda i risultati dei vantaggi delle prestazioni collegate, per favore.
2540625,

3

sottostringa (): ha 2 parametri "start" e "end".

  • Il parametro start è obbligatorio e specifica la posizione da cui iniziare l'estrazione.
  • Il parametro end è facoltativo e specifica la posizione in cui dovrebbe terminare l'estrazione.

Se il parametro end non viene specificato, vengono estratti tutti i caratteri dalla posizione iniziale fino alla fine della stringa.

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

Output : Substring

Se il valore del parametro start è maggiore del valore del parametro end, questo metodo sostituirà i due argomenti. Ciò significa che inizio verrà utilizzato come fine e fine verrà utilizzato come inizio.

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

Output : Substring

substr () : ha 2 parametri "start" e "count".

  • Il parametro start è obbligatorio e specifica la posizione da cui iniziare l'estrazione.

  • Il parametro count è facoltativo e specifica il numero di caratteri da estrarre.

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


Output : Substr Exa

Se il parametro count non è specificato, vengono estratti tutti i caratteri dalla posizione iniziale fino alla fine della stringa. Se count è 0 o negativo, viene restituita una stringa vuota.

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

Output : ple


2

sottostringa (startIndex, endIndex (non incluso))

substr (startIndex, quanti caratteri)

const string = 'JavaScript';

console.log('substring(1,2)', string.substring(1,2)); // a
console.log('substr(1,2)', string.substr(1,2)); // av
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.