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

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

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

а также

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

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

 Sinjai26 янв. 2018 г., 07:11
Я думаю, что более важный вопрос: «Почему JavaScript имеет иsubstr метод иsubstring метод "? Это действительно предпочтительный метод перегрузки?"
 Dzeimsas Zvirblis27 июн. 2016 г., 21:08
Добавление к комментарию @Derek ... В отличие отslice метод,substring не обрабатывает настройку для отрицательных параметров.
 Steven Lu16 июл. 2013 г., 23:02
@Derek 朕 會 功夫 Примечание,substring превосходит все остальные на Chrome в последнее время
 jamess17 сент. 2018 г., 19:16
На сегодняшний день MDN имеет большое красное предупреждение оsubstr() это то, что вы могли бы назвать «псевдо-устаревшим» в верхней части страницы документации здесь:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - Есть ли у кого-нибудь больше информации об этом, например, есть ли браузер, который планирует фактически отказатьсяsubstr() в любой момент в будущем? Или, как предположил Стивен Лу, могут быть недостатки производительности при использованииsubstr() идти вперед?

Ответы на вопрос(9)

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

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

 jtheletter19 июл. 2016 г., 23:57
Этот ответ был бы лучше, если бы в нем содержался краткий текст о выводах связанных преимуществ производительности, пожалуйста.

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

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

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'
 Jill-Jênn Vie20 февр. 2017 г., 21:04
такие цифры очень летят вау
Решение Вопроса

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

Ссылки?

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

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

 André Chalella20 окт. 2015 г., 04:48
@Pawel также, когда вы хотите, чтобы он дошел до конца строки (без второго аргумента)
 schnaader19 сент. 2010 г., 13:46
Звучит как распространенный источник ошибок. Приятно знать разницу. Нашли дополнительные комментарии по этому поводу здесь:rapd.wordpress.com/2007/07/12/javascript-substr-vs-substring
 youen26 июл. 2017 г., 21:46
Также следует упомянуть разницу в первом аргументе, которая может быть отрицательной для substr (в этом случае она начинается с конца), но не для подстроки. См. Ответ JefferMC, но у него так много голосов, что многие могут пропустить эту важную часть.
 Florian Callewaert19 июн. 2019 г., 09:45
substr обрабатывать отрицательное начальное значение, тогда какsubstring нет:"Hello".substr(-2); // return "lo" "Hello".substring(-2); // return "Hello"
 Michael Scheper19 июл. 2016 г., 12:22
Это настолько смешно, что я почти скучаю по дням разработки Java-апплетов. («Почти», потому что тогда нам приходилось беспокоиться об IE.)
 Frankey03 июн. 2015 г., 12:21
демонстрация в jsFiddle, запустите и посмотрите консоль:jsfiddle.net/m4crzwjs
 T S01 нояб. 2018 г., 14:52
Поскольку этот ответ является наиболее востребованным, его, вероятно, следует отредактировать, чтобы включитьString.prototype.substr() устарела ... (определяется вПриложение Б стандарта ECMA-262, чейвступление гласит: «… Программисты не должны использовать или предполагать существование этих функций и поведения при написании нового кода ECMAScript.…»)

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

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

Если параметр 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

зиЬзЬг ()У него есть 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

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

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

ОтMDN:

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

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

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

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

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

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"        

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

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

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

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

 colllin21 янв. 2014 г., 01:36
.substring() берет индексы. Вы можете помнить, потому что это единственное имя с «я» в названии..slice() берет показатели тоже.
 MyDaftQuestions10 нояб. 2015 г., 10:04
@colllin, этот комментарий по поводу i и показателей, безусловно, следует перенести в ответ!

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

 T S01 нояб. 2018 г., 18:56
Да, вот что я сказал: в стандарте он отмечен как устаревший! Или вы не считаете «не следует использовать или предполагать наличие этих функций» как устаревшие? Хорошо, они не используют слово «устарел», но описание кажется мне очень понятным ...
 5ervant10 янв. 2019 г., 06:04
@julian Потому что они не видятsubstr() наdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/... после того, как этот ответ был сделан.
 T S01 нояб. 2018 г., 14:44
@DanielMString.prototype.substr() определяется вПриложение Б стандарта ECMA-262, чейвступление гласит: «… Программисты не должны использовать или предполагать существование этих функций и поведения при написании нового кода ECMAScript.…»
 DanielM08 нояб. 2016 г., 11:01
Можете ли вы указать на надежный источник, который свидетельствует об устареванииsubstr()? Я прочитал это от нескольких человек, но я не могу найти никакой информации в Интернете, которая поддерживает заявление. Кроме того, Mozilla не включает его в список устаревших / устаревших функций:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
 5ervant01 нояб. 2018 г., 18:52
@TSsubstr() действительно отмечен как устаревший в некоторых документах.
 vbezhenar14 мар. 2019 г., 10:33
Это должен быть принятый ответ на сегодняшний день. Использование устаревших функций, когда есть альтернатива, не является хорошим вариантом для хорошего кода. Добавьте этот ответ, чтобы сделать его более заметным, поскольку Google ведет на эту страницу.
 5ervant08 нояб. 2016 г., 17:02
@DanielM Насколько я помню, он был устаревшим, когда я публикую этот ответ, может быть, статья изменилась, и теперь она не устарела(но не уверен).. Но все же записано на некоторых статьях, таких как вsstut.com/javascript/substring-method.php как устарел.
 julian10 янв. 2019 г., 03:57
Документ Mozilla, на который вы ссылаетесь, говорит, что, несмотря на то, что substr не является строго устаревшим, он считается устаревшей функцией, и его следует избегать, когда это возможно. Стоит упомянуть, поэтому не уверен, почему вы были отклонены.

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

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

Ваш ответ на вопрос