Это пример плохого дизайна JavaScript, в результате которого мы получили три метода, которые делают одно и то же, но с разными причудами. ИМО slice- та, с наименьшим неожиданным поведением.
bobince
2
Подстрока IMO, используемая для переноса подстроки от idx до конца, более понятна с первого взгляда. Особенно
новичкам
1
Согласно этому сайту , на sliceсамом деле может заменить, substringи нет никаких оснований для его использования.
Дерек 朕 會 功夫
5
@AmolMKulkarni Совсем не правда. Если вы попробуете var a = "asdf".substring(-1);, это будет рассматриваться как var a = "asdf".substring(0);. Там не исключение брошено. И если вы используете var a = "asdf".substring(2, -1);, он использует 0вместо -1(как прежде), и меняет аргументы, чтобы он действовал как var a = "asdf".substring(0, 2);. Я даже попробовал это на IE 8 и получил результаты без исключений
Ian
35
«Я даже пробовал это на IE 8» - я люблю программировать.
унылый
Ответы:
864
slice()работает как substring()с несколькими различными поведениями.
Если start > stop, slice()вернет пустую строку. ( "")
Если startотрицательно: устанавливает символ с конца строки, точно так же, как substr()в Firefox. Такое поведение наблюдается как в Firefox, так и в IE.
Если stopотрицательно: устанавливает стоп в: string.length – Math.abs(stop)(исходное значение), за исключением ограничения в 0 (таким образом, Math.max(0, string.length + stop)), как указано в спецификации ECMA .
В вашей последней заметке slice(), это должно бытьstring.length - stop
Энди
16
В вашей последней заметке slice(), я думаю, это должно быть (string.length – 1) + stopили, чтобы было ясно, что это отрицательно,(string.length – 1) – Math.abs(stop)
Oriol
9
@Longpoke: String.sliceбыл добавлен, так что есть строковый метод, соответствующий Array.slice. substringбыл там навсегда, поэтому они не сломали его и добавили еще один метод. Едва ли это дурацкое решение: 1. согласованность хороша, 2. она позволяет синтаксису нарезки CoffeeScript работать с массивами и строками. @Oriol: отредактировал его.
Летающая овца
6
Кажется, есть разница в производительности между подстрокой и слайсом
Рик
4
Энди был прав. stopбудет установлено, string.length + stopесли stopотрицательно. Помните, stopиндекс после последнего извлеченного символа!
user1537366
98
Примечание: если вы спешите и / или ищете короткий ответ, прокрутите до конца ответа и прочитайте последние две строки. Если не спешите, прочитайте все это.
Что оно делает?
В slice()методе извлекает часть строки и возвращает Извлеченные части в новой строке.
В substr()метод извлекает часть строки, начиная с символа в заданном положении, и возвращает заданное число символов.
В substring()методе извлекает часть строки и возвращает Извлеченные части в новой строке.
Заметка 2:slice()==substring()
Изменяет исходную строку? slice()Не не substr()не substring()не
замечает # 3:slice()==substring()
Использование отрицательных чисел в качестве аргумента: slice()выбирает символы, начиная с конца строки, substr()выбирает символы, начиная с конца строки, substring()не выполняет
Примечание № 3:slice()==substr()
если первый аргумент больше второго: slice()не выполняется, substr()так как второй аргумент НЕ является позицией, а значением длины, он будет работать как обычно, без проблем substring()поменять местами два аргумента и работать как обычно
Второй аргумент: slice()Необязательно, Позиция (до, но не включая), где заканчивать извлечение substr()Необязательно, Количество символов для извлечения substring()Необязательная, Позиция (до, но не включая), где заканчивать извлечение
Примечание # 5:slice()==substring()
Что если второй аргумент опущен? slice()выбирает все символы от начальной позиции до конца строки substr()выбирает все символы от начальной позиции до конца строки substring()выбирает все символы от начальной позиции до конца строки
Примечание # 6:slice()==substr()==substring()
Таким образом, вы можете сказать, что есть разница между slice()и substr(), в то время substring()как в основном это копия slice().
Подводя итоги:
если вы знаете индекс (позицию), на которой вы остановитесь (но НЕ включите), используйте, slice()
если вы знаете длину символов, которые нужно извлечь substr().
Это неверно, substr обрабатывает отрицательные параметры. '0123456789'.substr(-3, 2) -> '78'
Нил Фрейзер
14
Один ответ хорошо, но требует небольшого прочтения. Особенно с новой терминологией «стоп».
My Go - организован по различиям, чтобы сделать его полезным в дополнение к первому ответу Даниэля выше:
1) отрицательные показатели. Подстрока требует положительных индексов и установит отрицательный индекс равным 0. Отрицательный индекс среза означает позицию от конца строки.
Общий комментарий - я нахожу странным, что второй индекс - это позиция после последнего символа среза или подстроки. Я ожидаю, что «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.
Разница между подстрокой и срезом - в том, как они работают с аргументами минус и пропускающими строки за рубежом:
подстрока (начало, конец)
Отрицательные аргументы интерпретируются как ноль. Слишком большие значения усекаются до длины строки: 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-.
Если выбрать один из этих трех методов, для использования в большинстве ситуаций - это будет срез : отрицательные аргументы и его поддержка и работа наиболее очевидны.
substr: он позволяет нам получить часть строки на основе указанного индекса. Синтаксис substr-string.substr (start, end) start - start указывает, где начинается выборка. end - end index указывает, куда извлекается строка. Это необязательно.
slice: обеспечивает выборку части строки на основе указанного индекса. Это позволяет нам указывать позитив и индекс. синтаксис slice - string.slice (start, end) start - start index указывает, где происходит выборка start.It end - end index указывает, где строка выбирается. Это необязательно. В «соединении» как начальный, так и конечный индексы помогают получить положительный и отрицательный индексы.
пример кода для «среза» в строке
var str="Javascript";
console.log(str.slice(-5,-1));
output: crip
пример кода для «подстроки» в строке
var str="Javascript";
console.log(str.substring(1,5));
output: avas
[* Примечание: отрицательная индексация начинается в конце строки.]
start_index
Индекс, откуда должен начинаться срез. Если значение указано в отрицательном значении, это означает начало с последнего. например, -1 для последнего символа.
END_INDEX
Индекс после конца слайса. Если не указано, срез будет взят из start_index до конца строки. В случае отрицательного значения индекс будет измеряться с конца строки.
from
Это должно быть неотрицательное целое число, чтобы указать индекс, с которого должна начинаться подстрока.
к
факультативному не отрицательное целое число , чтобы обеспечить индекс , перед которым суб-строка должна быть закончена.
slice
- та, с наименьшим неожиданным поведением.slice
самом деле может заменить,substring
и нет никаких оснований для его использования.var a = "asdf".substring(-1);
, это будет рассматриваться какvar a = "asdf".substring(0);
. Там не исключение брошено. И если вы используетеvar a = "asdf".substring(2, -1);
, он использует0
вместо-1
(как прежде), и меняет аргументы, чтобы он действовал какvar a = "asdf".substring(0, 2);
. Я даже попробовал это на IE 8 и получил результаты без исключенийОтветы:
slice()
работает какsubstring()
с несколькими различными поведениями.Что у них общего:
start
равноstop
: возвращает пустую строкуstop
опущено: извлекает символы до конца строкиОтличия :
substring()
start > stop
, тоsubstring
поменять эти 2 аргумента.NaN
какой- либо аргумент является отрицательным или имеет значение , он обрабатывается так, как если бы он был0
.Отличия :
slice()
start > stop
,slice()
вернет пустую строку. (""
)start
отрицательно: устанавливает символ с конца строки, точно так же, какsubstr()
в Firefox. Такое поведение наблюдается как в Firefox, так и в IE.stop
отрицательно: устанавливает стоп в:string.length – Math.abs(stop)
(исходное значение), за исключением ограничения в 0 (таким образом,Math.max(0, string.length + stop)
), как указано в спецификации ECMA .Источник: элементарное искусство программирования и развития: Javascript: substr () vs substring ()
источник
slice()
, это должно бытьstring.length - stop
slice()
, я думаю, это должно быть(string.length – 1) + stop
или, чтобы было ясно, что это отрицательно,(string.length – 1) – Math.abs(stop)
String.slice
был добавлен, так что есть строковый метод, соответствующийArray.slice
.substring
был там навсегда, поэтому они не сломали его и добавили еще один метод. Едва ли это дурацкое решение: 1. согласованность хороша, 2. она позволяет синтаксису нарезки CoffeeScript работать с массивами и строками. @Oriol: отредактировал его.stop
будет установлено,string.length + stop
еслиstop
отрицательно. Помните,stop
индекс после последнего извлеченного символа!Примечание: если вы спешите и / или ищете короткий ответ, прокрутите до конца ответа и прочитайте последние две строки. Если не спешите, прочитайте все это.
позвольте мне начать с констатации фактов:
Синтаксис:
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()
.источник
Бен Надель написал хорошую статью об этом, он указывает на разницу в параметрах для этих функций:
Он также указывает, что если параметры для среза отрицательны, они ссылаются на строку с конца. Substring и substr не имеют.
Вот его статья об этом.
источник
'0123456789'.substr(-3, 2) -> '78'
Один ответ хорошо, но требует небольшого прочтения. Особенно с новой терминологией «стоп».
My Go - организован по различиям, чтобы сделать его полезным в дополнение к первому ответу Даниэля выше:
1) отрицательные показатели. Подстрока требует положительных индексов и установит отрицательный индекс равным 0. Отрицательный индекс среза означает позицию от конца строки.
2) Перестановка индексов. Подстрока будет переупорядочивать индексы, чтобы первый индекс был меньше или равен второму индексу.
--------------------------
Общий комментарий - я нахожу странным, что второй индекс - это позиция после последнего символа среза или подстроки. Я ожидаю, что «1234» .slice (2,2) вернет «3». Это оправдывает путаницу Энди выше - я ожидаю, что «1234» .slice (2, -1) вернет «34». Да, это означает, что я новичок в Javascript. Это означает также это поведение:
Мой 2с.
источник
Разница между подстрокой и срезом - в том, как они работают с аргументами минус и пропускающими строки за рубежом:
подстрока (начало, конец)
Отрицательные аргументы интерпретируются как ноль. Слишком большие значения усекаются до длины строки: alert ("testme" .substring (-2)); // "testme", -2 становится 0
Кроме того, если start> end, аргументы взаимозаменяемы, то есть линия графика возвращается между началом и концом:
кусочек
Отрицательные значения измеряются с конца строки:
Это гораздо удобнее, чем странная логическая подстрока.
Отрицательное значение первого параметра для substr поддерживается во всех браузерах, кроме IE8-.
Если выбрать один из этих трех методов, для использования в большинстве ситуаций - это будет срез : отрицательные аргументы и его поддержка и работа наиболее очевидны.
источник
substr: он позволяет нам получить часть строки на основе указанного индекса. Синтаксис substr-string.substr (start, end) start - start указывает, где начинается выборка. end - end index указывает, куда извлекается строка. Это необязательно.
slice: обеспечивает выборку части строки на основе указанного индекса. Это позволяет нам указывать позитив и индекс. синтаксис slice - string.slice (start, end) start - start index указывает, где происходит выборка start.It end - end index указывает, где строка выбирается. Это необязательно. В «соединении» как начальный, так и конечный индексы помогают получить положительный и отрицательный индексы.
пример кода для «среза» в строке
пример кода для «подстроки» в строке
[* Примечание: отрицательная индексация начинается в конце строки.]
источник
Единственная разница между срезом и методом подстроки состоит в аргументах
Оба принимают два аргумента, например, start / from и end / to.
Вы не можете передать отрицательное значение в качестве первого аргумента для метода подстроки, но для метода среза, чтобы пройти его от конца.
Детали аргумента метода среза:
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
аргументы
from Это должно быть неотрицательное целое число, чтобы указать индекс, с которого должна начинаться подстрока. к факультативному не отрицательное целое число , чтобы обеспечить индекс , перед которым суб-строка должна быть закончена.
источник
Для
slice(start, stop)
, еслиstop
отрицательно,stop
будет установлено:скорее, чем:
источник