В чем разница между substr и substring?

844

В чем разница между

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

а также

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

Кажется, они оба выводят «ab».

Разница Двигатель
источник
13
@Derek 功夫 會 功夫 Обратите внимание, в последнее время он substring превосходит все остальные в Chrome .
Стивен Лу
4
Добавление к комментарию @Derek ... В отличие от sliceметода, substringне обрабатывает настройку для отрицательных параметров.
Дзеймсас Звирблис
1
Я думаю, что более важный вопрос - «почему в JavaScript есть и substrметод, и substringметод»? Это действительно предпочтительный метод перегрузки?
Синджай
7
На сегодняшний день MDN имеет большое красное предупреждение о substr()том, что вы можете назвать «псевдо-устаревшим» в верхней части страницы документации здесь: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - Есть ли у кого-нибудь дополнительная информация об этом, например, есть ли какой-либо браузер, который планирует фактически отказаться от использования substr()в любой момент в будущем? Или, как предположил Стивен Лу, могут быть недостатки производительности при использовании в substr()будущем?
Джеймс

Ответы:

930

Разница во втором аргументе. Второй аргумент substring- это индекс, на котором нужно остановиться (но не включающий), но второй аргумент substr- это максимальная длина, которую нужно вернуть.

Ссылки?

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

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

Делан Азабани
источник
61
Звучит как распространенный источник ошибок. Приятно знать разницу. Дополнительные комментарии об этом можно найти
schnaader
3
@Pawel также, когда вы хотите, чтобы он дошел до конца строки (без второго аргумента)
Андре Шалелла
Это настолько смешно, что я почти скучаю по дням разработки Java-апплетов. («Почти», потому что тогда нам приходилось беспокоиться об IE.)
Майкл Шепер
2
Также следует упомянуть разницу в первом аргументе, которая может быть отрицательной для substr (в этом случае она начинается с конца), но не для подстроки. См. Ответ JefferMC, но у него так много голосов, что многие могут пропустить эту важную часть.
youen
2
Поскольку этот ответ является наиболее востребованным, его, вероятно, следует отредактировать, включив в String.prototype.substr()него устаревший ... (Он определен в Приложении B стандарта ECMA-262, введение которого гласит: «… Программисты не должны использовать или принимать существование этих функций и поведения при написании нового кода ECMAScript.… ")
TS
309

substring( MDN ) принимает параметры как (from, to).
substr( MDN ) принимает параметры как (from, length).

Обновление : MDN считает substrнаследство.

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

Вы можете помнить, substringберет индексы, как и еще один метод извлечения строки, slice .

При запуске с 0 вы можете использовать любой метод.

Колин Хеберт
источник
140
.substring()берет индексы. Вы можете помнить, потому что это единственное имя с «я» в названии. .slice()берет показатели тоже.
Коллин
10
@colllin, этот комментарий по поводу i и показателей, безусловно, следует перенести в ответ!
MyDaftQuestions
35

Как указывалось в ответе yatima2975, есть еще одно отличие:

substr()принимает отрицательную начальную позицию как смещение от конца строки. substring()не.

От MDN :

Если начало отрицательно, substr () использует его как индекс символа с конца строки.

Итак, подведем итоги функциональных отличий:

substring(begin-offset, end-offset-exclusive)где начало-смещение 0или больше

substr(begin-offset, length) где начало-смещение также может быть отрицательным

JefferMC
источник
25

Еще одна ошибка, с которой я недавно столкнулся, заключается в том, что в IE 8 происходит "abcd".substr(-1)ошибочное возвращение "abcd", тогда как Firefox 3.6 возвращается "d"так, как должно. sliceработает правильно на обоих.

Больше на эту тему можно найти здесь .

yatima2975
источник
17

Основное отличие состоит в том, что

substr () позволяет указать максимальную длину для возврата

substring () позволяет указывать индексы, а второй аргумент НЕ включается

Есть некоторые дополнительные тонкости между substr () и substring (), такие как обработка равных аргументов и отрицательных аргументов. Также обратите внимание, что substring () и slice () похожи, но не всегда одинаковы.

  //*** 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"        
Нейт Липп
источник
Вы пропустили полезный «отрицательный второй аргумент» для slice:"string".slice(2,-2); // "ri"
Пол
8

Разница является вторым параметром. Их вторые параметры, в то время как оба числа, ожидают две разные вещи:

При использовании подстроки вторым параметром является первый индекс, который не включает:

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

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

При использовании substr вторым параметром является количество символов, включаемых в подстроку:

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

var s = "another example";
s.substr(3, 7); // would return 'ther ex'
CurnalCurz
источник
5

Большая разница в том, substr()что это устаревший метод, который все еще можно использовать, но его следует использовать с осторожностью, поскольку ожидается, что он будет полностью удален в будущем. Вы должны работать, чтобы удалить их использование из вашего кода. И substring()метод удался и указал первый.

5ervant
источник
2
Можете ли вы указать на надежный источник, который свидетельствует об устаревании substr()? Я прочитал это от нескольких человек, но я не могу найти никакой информации в Интернете, которая поддерживает заявление. Кроме того, Mozilla не включает его в список устаревших / устаревших функций: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
DanielM
@DanielM Насколько я помню, он был устаревшим, когда я публикую этот ответ, может быть, статья изменилась, и теперь она не устарела (но не уверен) .. Но все же записано в некоторых статьях, таких как sstut.com/javascript/substring- method.php устарел.
5ervant
3
@DanielM String.prototype.substr()определено в Приложении B стандарта ECMA-262, введение которого гласит: «… Программисты не должны использовать или предполагать существование этих функций и поведения при написании нового кода ECMAScript.…»
TS
@TS substr()действительно отмечен как устаревший в некоторых документах.
5
2
Это должен быть принятый ответ на сегодня. Использование устаревших функций, когда есть альтернатива, не является хорошим вариантом для хорошего кода. Добавьте этот ответ, чтобы сделать его более заметным, поскольку Google ведет на эту страницу.
вбеженар
4

Методы среза против субстрата против субстроки против []

Есть преимущества в производительности для каждого из этих методов javascript. Пожалуйста, используйте эти функции соответственно.

Ali007
источник
9
Этот ответ был бы лучше, если бы в нем содержался краткий текст о выводах связанных преимуществ производительности, пожалуйста.
2540625
3

substring (): имеет 2 параметра: «начало» и «конец».

  • Параметр start является обязательным и указывает позицию, с которой начинается извлечение.
  • Параметр end является необязательным и указывает позицию, в которой должно заканчиваться извлечение.

Если параметр end не указан, извлекаются все символы от начальной позиции до конца строки.

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

Output : Substring

Если значение параметра start больше значения параметра end, этот метод поменяет местами два аргумента. Это означает, что начало будет использоваться как конец, а конец будет использоваться как начало.

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

Output : Substring

substr () : имеет 2 параметра: «старт» и «счет».

  • Параметр start является обязательным и указывает позицию, с которой начинается извлечение.

  • Параметр count является необязательным и указывает количество символов для извлечения.

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


Output : Substr Exa

Если параметр count не указан, извлекаются все символы от начальной позиции до конца строки. Если число равно 0 или отрицательно, возвращается пустая строка.

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

Output : ple

раю полою
источник
2

подстрока (startIndex, endIndex (не включены))

substr (startIndex, сколько символов)

const string = 'JavaScript';

console.log('substring(1,2)', string.substring(1,2)); // a
console.log('substr(1,2)', string.substr(1,2)); // av
Саджит Мантхарат
источник