В чем разница между String.slice и String.substring? - PullRequest
704 голосов
/ 11 февраля 2010

Кто-нибудь знает, в чем разница между этими двумя методами:

String.protorype.slice
String.protorype.substring

Ответы [ 8 ]

744 голосов
/ 11 февраля 2010

slice() работает как substring() с несколькими вариантами поведения.

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

Что у них общего:

  1. Если start равно stop: возвращает пустую строку
  2. Если stop опущен: извлекает символы до конца строки
  3. Если какой-либо аргумент превышает длину строки, вместо нее будет использоваться длина строки.

Различия substring():

  1. Если start > stop, то substring поменяет эти 2 аргумента.
  2. Если любой аргумент отрицательный или равен NaN, он обрабатывается так, как если бы он был 0.

Различия slice():

  1. Если start > stop, slice() вернет пустую строку. ("")
  2. Если start отрицательно: устанавливает символ с конца строки, точно так же, как substr() в Firefox. Такое поведение наблюдается как в Firefox, так и в IE.
  3. Если stop отрицательно: устанавливает останов в: string.length – Math.abs(stop) (исходное значение), за исключением ограничения в 0 (таким образом, Math.max(0, string.length + stop)), как указано в спецификации ECMA .

Источник: Элементарное искусство программирования и развития: Javascript: substr () v.s. подстрока ()

81 голосов
/ 10 августа 2015

Примечание: если вы спешите и / или ищете короткий ответ, прокрутите его до конца и прочитайте две последние строки. Если не спешите, прочитайте все целиком.


позвольте мне начать с констатации фактов:

Синтаксис:
string.slice(start,end)
string.substr(start,length)
string.substring(start,end)
Примечание № 1: slice()==substring()

Что это делает?
Метод slice() извлекает части строки и возвращает извлеченные части в новой строке.
Метод substr() извлекает части строки, начиная с символа в указанной позиции, и возвращает указанное количество символов.
Метод substring() извлекает части строки и возвращает извлеченные части в новой строке.
Примечание № 2: slice()==substring()

Изменяет исходную строку?
slice() Не
substr() не
substring() Не
Примечание № 3: slice()==substring()

Использование отрицательных чисел в качестве аргумента:
slice() выбирает символы, начиная с конца строки
substr() выбирает символы, начиная с конца строки
substring() не выполняет
Примечание № 3: slice()==substr()

если первый аргумент больше второго:
slice() не выполняет
substr(), поскольку Второй Аргумент - это НЕ позиция, а значение длины, он будет работать как обычно, без проблем
substring() поменяет два аргумента и будет работать как обычно

Первый аргумент:
slice() Обязательно, указывает: Начальный индекс
substr() Обязательно, указывает: Начальный индекс
substring() Обязательно, указывает: Начальный индекс
Примечание № 4: slice()==substr()==substring()

Второй аргумент:
slice() Необязательно, Позиция (до, но не включая), где заканчивается извлечение
substr() Необязательно, Количество символов для извлечения
substring() Необязательно, позиция (до, но не включая), где заканчивать извлечение
Примечание № 5: slice()==substring()

Что если второй аргумент опущен?
slice() выбирает все символы от начальной позиции до конца строки
substr() выбирает все символы от начальной позиции до конца строки
substring() выбирает все символы от начальной позиции до конца строки
Примечание № 6: slice()==substr()==substring()

Итак, вы можете сказать, что есть разница между slice() и substr(), в то время как substring() в основном является копией slice().

в резюме:
если вы знаете индекс (позицию), на которой вы остановитесь (но НЕ включите), используйте slice()
если вы знаете длину символов для извлечения, используйте substr().

18 голосов
/ 05 декабря 2014

Бен Надель написал хорошую статью по этому поводу, он указывает на разницу в параметрах для этих функций:

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

Он также указывает, что если параметры для среза отрицательны, они ссылаются на строку с конца. Substring и substr не имеют.

Вот его статья об этом http://www.bennadel.com/blog/2159-using-slice-substring-and-substr-in-javascript.htm

10 голосов
/ 04 июня 2014

Один ответ в порядке, но требует небольшого прочтения. Особенно с новой терминологией «стоп».

My Go - организовано по различиям, чтобы сделать его полезным в дополнение к первому ответу Даниэля выше:

1) отрицательные показатели. Подстрока требует положительных индексов и установит отрицательный индекс равным 0. Отрицательный индекс среза означает позицию от конца строки.

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

2) Перестановка индексов. Подстрока переупорядочит индексы, чтобы первый индекс был меньше или равен второму.

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

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

Общий комментарий - мне кажется странным, что второй индекс - это позиция после последнего символа фрагмента или подстроки. Я ожидаю, что «1234» .slice (2,2) вернет «3». Это оправдывает путаницу Энди выше - я ожидаю, что «1234» .slice (2, -1) вернет «34». Да, это означает, что я новичок в Javascript. Это также означает следующее поведение:

"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.

Мой 2с.

9 голосов
/ 05 февраля 2016

Разница между подстрокой и срезом - это то, как они работают с аргументами минус и пропускающими строки за границей:

подстрока (начало, конец)

Отрицательные аргументы интерпретируются как ноль. Слишком большие значения усекаются до длины строки: alert ("testme" .substring (-2)); // "testme", -2 становится 0

Кроме того, если начало> конец, аргументы взаимозаменяемы, то есть линия графика возвращается между началом и концом:

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"

ломтик

Отрицательные значения измеряются от конца строки:

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.

Это намного удобнее, чем странная логическая подстрока.

Отрицательное значение первого параметра для substr поддерживается во всех браузерах, кроме IE8 -.

Если выбрать один из этих трех методов, для использования в большинстве ситуаций - это будет slice : отрицательные аргументы, и он поддерживает и работает наиболее очевидно.

2 голосов
/ 24 мая 2016

Единственное различие между методом среза и подстроки состоит в аргументах

Оба принимают два аргумента, например начало / с и конец / до.

Нельзя передать отрицательное значение в качестве первого аргумента для метода substring , но для метода slice для его обхода с конца.

Детали аргумента метода среза:

REF: http://www.thesstech.com/javascript/string_slice_method

Аргументы

start_index Индекс, откуда должен начинаться срез. Если значение указано в отрицательном значении, это означает начало с последнего. например -1 для последнего персонажа. END_INDEX Индекс после конца среза. Если не указано, фрагмент будет перенесен из start_index в конец строки. В случае отрицательного значения индекс будет измеряться с конца строки.

Детали аргумента метода подстроки:

REF: http://www.thesstech.com/javascript/string_substring_method

Аргументы

от Это должно быть неотрицательное целое число, чтобы указать индекс, с которого должна начинаться подстрока. до Необязательное неотрицательное целое число для указания индекса, до которого должна быть завершена подстрока.

1 голос
/ 24 марта 2019

substr: он позволяет нам извлекать часть строки на основе указанного индекса. синтаксис String.substr (начало, конец) start - start index указывает, где начинается выборка. end - end index указывает, куда извлекается строка. Это необязательно.

slice: обеспечивает выборку части строки на основе указанного индекса. Это позволяет нам указывать позитив и индекс. синтаксис слайса - string.slice (начало, конец) начало - индекс начала сообщает, где начинается выборка. end - end index указывает, куда извлекается строка. Это необязательно. В «соединении» как начальный, так и конечный индексы помогают принимать положительные и отрицательные показатели.

пример кода для «среза» в строке

var str="Javatscript";
console.log(str.slice(-5,-1));

output: crip

пример кода для «подстроки» в строке

var str="Javatscript";
console.log(str.substring(1,5));

output: avat

[* Примечание: отрицательное индексирование начинается в конце строки.]

0 голосов
/ 29 марта 2017

Для слайса (начало, остановка), если остановка отрицательна, останов будет установлен на: string.length - Math.abs (остановка), а точнее (string.length - 1) - Math.abs (остановка).

...