Кто-нибудь знает, в чем разница между этими двумя методами:
String.prototype.slice
String.prototype.substring
Кто-нибудь знает, в чем разница между этими двумя методами:
String.prototype.slice
String.prototype.substring
slice()
работает как substring()
с несколькими различными поведениями.
Syntax: string.slice(start, stop);
Syntax: string.substring(start, stop);
Что у них общего:
start
равно stop
: возвращает пустую строкуstop
не указан: извлекает символы до конца строки Различия substring()
:
start > stop
, то substring
поменяет эти 2 аргумента.NaN
, он обрабатывается так, как если бы он был 0
. Различия slice()
:
start > stop
, slice()
вернет пустую строку. (""
)start
отрицательно: устанавливает символ с конца строки, точно так же, как substr()
в Firefox. Такое поведение наблюдается как в Firefox, так и в IE.stop
отрицателен: устанавливает stop в: string.length – Math.abs(stop)
(исходное значение), за исключением ограничения в 0 (таким образом, Math.max(0, string.length + stop)
), как указано в спецификации ECMA,Источник: элементарное искусство программирования и развития: Javascript: substr() vs substring()
Примечание: если вы спешите и/или ищете короткий ответ, прокрутите до конца ответа и прочитайте последние две строки. Если не спешите, прочитайте все это.
позвольте мне начать с констатации фактов:
Синтаксис: 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()
.
Бен Надель написал хорошую статью об этом, он указывает на разницу в параметрах этих функций:
String.slice( begin [, end ] )
String.substring( from [, to ] )
String.substr( start [, length ] )
Он также указывает, что если параметры среза отрицательны, они ссылаются на строку с конца. Подстрока и substr нет.
Вот его статья об этом http://www.bennadel.com/blog/2159-using-slice-substring-and-substr-in-javascript.htm
Один ответ хорошо, но требует небольшого прочтения. Особенно с новой терминологией "стоп".
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с.
Разница между подстрокой и срезом - это то, как они работают с отрицательными и игнорирующими линиями за границей аргументы:
подстрока (начало, конец)
Отрицательные аргументы интерпретируются как ноль. Слишком большие значения усекаются по длине строки: alert ( "testme".substring(-2));// "testme", -2 становится 0
Кроме того, если start > end, аргументы взаимозаменяемы, т.е. строка линии возвращает между началом и концом:
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: отрицательные аргументы, и он поддерживает и действует наиболее очевидно.
String.prototype.slice
Лечение негативных показателей
- " Если [любой аргумент] отрицательный, он рассматривается как
strLength +
[index
], гдеstrLength
- длина строки (например, если [index
] является-3
он рассматривается какstrLength - 3
) ".Начальный индекс больше конечного индекса
" Если [начальный индекс] больше или равен [обработке конечного индекса] [строкового среза],
slice()
возвращает пустую строку ".- MDN
String.prototype.substring
Лечение негативных показателей
- " Если любой из аргументов [отрицателен] [...], он обрабатывается так, как если бы он был
0
".Начальный индекс больше конечного индекса
" Если [начальный индекс] больше, чем [конечный индекс], тогда
эффектsubstring()
выглядит так, как если бы оба аргумента были заменены; например,str.substring(1, 0) == str.substring(0, 1)
. "- MDN
Я думаю, что все остальное одинаково, в том числе:
undefined
индекса не undefined
, он становится длиной строки.0
. * Вышеупомянутое также относится к методу substr()
, за исключением того, что substr()
не имеет аргумента конечного индекса.
String.prototype.substr
[немного выходит за рамки вопроса]
String.prototype.substr
очень похож на slice()
, особенно в отношении обработки отрицательных чисел для значений индекса; однако ключевое различие заключается в том, что второй аргумент substr()
не указывает конечный индекс, а длину символов, возвращаемых вызывающим абонентом. Достаточно сказать, что substr()
ведет себя так же предсказуемо, как slice()
выходит за пределы этой ключевой разницы; передача отрицательного аргумента length
возвращает пустую строку с помощью этого метода.Единственное различие между методом среза и подстроки состоит из аргументов
Оба принимают два аргумента, например. start/from и end/to.
Вы не можете передать отрицательное значение в качестве первого аргумента для метода подстроки, но для метода 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
Аргументы
от Он должен быть неотрицательным целым числом, чтобы указать индекс, из которого должна начинаться подстрока. до Необязательное неотрицательное целое число для предоставления индекса, перед которым должна быть завершена подстрока.
substr: предоставляет нам возможность извлекать часть строки на основе указанного индекса. синтаксис substr- String.substr (начало, конец) start - start index указывает, где начинается выборка. end - end index указывает, куда извлекается строка. Это необязательно.
slice: обеспечивает выборку части строки на основе указанного индекса. Это позволяет нам указывать позитив и индекс. синтаксис слайса - string.slice (начало, конец) start - start index указывает, откуда начинается выборка. end - end index указывает, куда извлекается строка. Это необязательно. В "сплайсинге" начальный и конечный индексы помогают получить положительный и отрицательный индексы.
пример кода для фрагмента в строке
var str="Javascript";
console.log(str.slice(-5,-1));
output: crip
пример кода для 'substring' в строке
var str="Javascript";
console.log(str.substring(1,5));
output: avas
[* Примечание: отрицательная индексация начинается в конце строки.]
Для slice(start, stop)
, если stop
отрицательна, stop
будет установлен на:
string.length – Math.abs(stop)
скорее, чем:
string.length – 1 – Math.abs(stop)
slice (начало: число, конец: число) Извлекает часть строки между заданными начальными/конечными позициями.
подстрока (начало: номер, конец: номер) Как срез, извлекает часть строки между заданными начальными/конечными позициями.
Для среза второй аргумент является необязательным. подстрока похожа на срез, но два аргумента могут быть заданы в любом порядке.