Чим відрізняється String.slice від String.substring?


833

Хтось знає, в чому різниця між цими двома методами?

String.prototype.slice
String.prototype.substring

215
Це приклад поганого дизайну JavaScript, який ми закінчили трьома методами, які всі роблять те саме, але з різними химерностями. ІМО slice- це найменш несподівана поведінка.
bobince

2
Підрядка IMO, коли використовується для отримання підрядки від idx до кінця, є зрозумілішим на перший погляд. Особливо для noobs
mplungjan

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 і отримав результати без винятку
Ян

35
"Я навіть спробував це в IE 8" - я люблю програмування.
пам’ятний

Відповіді:


859

slice()працює як substring()з кількома різними способами поведінки.

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

Що їх спільного:

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

Відмінність :substring()

  1. Якщо start > stop, тоді substringбуде поміняти місцями ці два аргументи.
  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 () vs substring ()


8
У вашій останній записці про 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
Здається, у Firefox 22. існує
Рік

4
Енді мав рацію. stopбуде встановлено, string.length + stopякщо stopнегативний. Пам’ятайте, stopце індекс після вилучення останнього символу!
користувач1537366

97

Примітка: якщо ви поспішаєте та / або шукаєте коротку відповідь, прокрутіть до нижньої частини відповіді та прочитайте два останні рядки. Якщо не поспішайте прочитати всю справу.


дозвольте мені розпочати, констатуючи факти:

Синтаксис:
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().


11
substr () не слід використовувати developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Killy

24

Бен Надель написав добру статтю з цього приводу, він вказує на різницю параметрів цих функцій:

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

Він також вказує, що якщо параметри для зрізу негативні, вони посилаються на рядок з кінця. Підрядка та substr не знаходяться.

Ось його стаття про це.


3
Це неправильно, substr обробляє негативні параметри. '0123456789'.substr(-3, 2) -> '78'
Ніл Фрейзер

14

Одна відповідь чудова, але вимагає трохи ознайомитися. Особливо з новою термінологією «стоп».

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


11

Різниця між підрядками та фрагментом - полягає в тому, як вони працюють з негативними та пропускаючими рядками за межами аргументів:

підрядка (початок, кінець)

Негативні аргументи трактуються як нульові. Занадто великі значення прирізані до довжини рядка: alert ("testme" .substring (-2)); // "тест", -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.

Це набагато зручніше, ніж дивна логічна підрядка.

Від'ємне значення першого параметра для підстрочки, що підтримується у всіх браузерах, крім IE8-.

Якщо вибір одного з цих трьох методів, для використання в більшості ситуацій - це буде фрагмент : негативні аргументи, і він підтримує і оперує найбільш очевидним.


4

substr: Це дає нам отримати частину рядка на основі визначеного індексу. синтаксис substr- string.substr (початок, кінець) start - індекс запуску повідомляє, з чого починається завантаження. індекс кінця - кінець повідомляє, до якого строку надходить рядок. Це необов’язково.

фрагмент: Він пропонує отримати частину рядка на основі вказаного індексу. Це дозволяє нам вказати позитивні та індексувати. синтаксис фрагмента - string.slice (початок, кінець) старт - індекс запуску вказує, де починається завантаження. Індекс кінця - кінець вказує до того, де виводиться рядок. Це необов’язково. У "сплайсі" як початковий, так і кінцевий індекс допомагає приймати позитивний та негативний індекс.

зразок коду для 'slice' у рядку

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

output: crip

зразок коду для 'підрядка' у рядку

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

output: avas

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


3

Єдина відмінність між фрагментом і методом підрядків - це аргументи

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

Ви не можете передавати негативне значення як перший аргумент для методу підрядки, але для фрагмента метод , щоб пройти його з кінця.

Деталі аргументу методу фрагмента:

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

Аргументи

з Це повинно бути невід'ємним цілим числом, щоб вказати індекс, з якого слід починати підряд. до необов'язкового невід'ємного цілого числа для надання індексу, перед яким підрядку слід закінчити.


0

Бо slice(start, stop), якщо stopнегативний, stopбуде встановлено:

string.length  Math.abs(stop)

а не:

string.length  1  Math.abs(stop)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.