Яка різниця між substr та substring?


844

Яка різниця між

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

і

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

Вони, здається, виводять "ab".


13
@Derek 朕 會 功夫 Примітка, substring переважає всі інші в Chrome із запізненням.
Стівен Лу

4
Додавання до коментаря @Derek ... На відміну від sliceметоду, substringне обробляє коригування для негативних параметрів.
Dzeimsas Zvirblis

1
Я думаю, що більш важливим питанням є "чому в JavaScript є і substrметод, і substringметод"? Це справді кращий метод перевантаження?
Сінджай

7
На сьогоднішній день MDN має велике червоне попередження про substr()те, що ви можете назвати "псевдозастареним" вгорі сторінки документів тут: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - Хтось має більше інформації про це, наприклад, чи є якийсь браузер, який планує фактично застаріти substr()в будь-який момент майбутнього? Або, як запропонував Стівен Лу, можуть бути недоліки в роботі щодо використання substr()вперед?
jamess

Відповіді:


930

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

Посилання?

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

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


61
Звучить як загальне джерело помилок. Добре знати різницю. Тут можна знайти додаткові коментарі: rapd.wordpress.com/2007/07/12/javascript-substr-vs-substring
schnaader

3
@Pawel також тоді, коли ви хочете, щоб це було в кінці рядка (немає другого аргументу)
Андре Шалелла

Це настільки смішно, що я майже сумую за днями розробки апплетів Java. («Майже», тому що нам довелося переживати про IE тоді.)
Майкл Шепер,

2
Ви також повинні зазначити різницю в першому аргументі, яка може бути негативною для substr (у такому випадку вона починається з кінця), але не для підрядкової. Дивіться відповідь JefferMC, але у неї стільки менше голосів, що багато людей можуть пропустити цю важливу частину.
youen

2
Оскільки це найбільш відома відповідь, вона, мабуть, повинна бути відредагована, щоб включити те, що String.prototype.substr()застаріло ... (Це визначено в Додатку B стандарту ECMA-262, у вступі якого зазначено: "... Програмісти не повинні використовувати або припускати існування цих особливостей та поведінки під час написання нового коду ECMAScript ... ")
TS

309

substring( MDN ) приймає параметри як (from, to).
substr( MDN ) приймає параметри як (from, length).

Оновлення : MDN вважає substrспадщину.

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

Ви можете пам'ятати, що substringприймає індекси, як і ще один метод вилучення рядків, фрагмент .

Починаючи з 0, ви можете використовувати будь-який метод.


140
.substring()бере показники. Ви можете згадати, тому що це єдине, у якому в назві є 'я'. .slice()індекси теж приймає.
коллін

10
@colllin, цей коментар про i та показники, безумовно, слід перенести у відповідь!
MyDaftQuestions

35

Як натякає у відповіді yatima2975, є додаткова різниця:

substr()приймає негативну початкову позицію як зміщення від кінця рядка. substring()не.

Від MDN :

Якщо старт негативний, substr () використовує його як індекс символів з кінця рядка.

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

substring(begin-offset, end-offset-exclusive)де початкове зміщення 0більше або більше

substr(begin-offset, length) де початкове зміщення також може бути негативним


25

Ще одна проблема, на яку я нещодавно натрапила - це те, що в IE 8 "abcd".substr(-1)помилково повертається "abcd", тоді як Firefox 3.6 повертається "d"як слід. sliceпрацює правильно на обох.

Більше про цю тему можна прочитати тут .


17

Основна відмінність полягає в тому

substr () дозволяє вказати максимальну довжину для повернення

substring () дозволяє вказувати індекси, а другий аргумент НЕ включений

Існують деякі додаткові тонкощі між substr () та substring (), такими як обробка рівних аргументів та негативних аргументів. Також зауважте, що підрядка () та фрагмент () схожі, але не завжди однакові.

  //*** 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"        

Ви пропустили корисний "другий негативний аргумент" для slice:"string".slice(2,-2); // "ri"
Павло

8

Різниця - другий параметр. Їхні другі параметри, хоча обидва числа, очікують двох різних речей:

При використанні підрядків другий параметр перший індекс не включає:

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'

5

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


2
Чи можете ви вказати на надійне джерело, яке вказує на депресію substr()? Я прочитав її від кількох людей, але не можу знайти жодної інформації в Інтернеті, яка б підтримувала цю заяву. Крім того, Mozilla не включає її до списку застарілих / застарілих функцій: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
DanielM

@DanielM Наскільки я пам’ятаю, вона була застарілою, коли я публікувала цю відповідь, можливо, стаття була змінена, і зараз вона не застаріла (але не впевнена) .. Але все ж записана в деяких статтях, таких як sstut.com/javascript/substring- method.php як застарілий.
5ervant

3
@DanielM String.prototype.substr()визначено у Додатку B стандарту ECMA-262, у вступі якого зазначено: "... Програмісти не повинні використовувати або припускати існування цих особливостей та поведінки під час написання нового коду ECMAScript ..."
TS

@TS substr()дійсно відзначається як застарілий у деяких документах.
5ervant

2
Це має бути прийнятою відповіддю на сьогодні. Використання застарілих функцій, коли є альтернатива, не є хорошим кодом. Будь ласка, надайте цю відповідь, щоб зробити її більш помітною, оскільки Google веде на цю сторінку.
вбеженар

4

Відрізок проти Substr проти Substring vs [] Методи

Кожен з цих методів JavaScript має переваги. Будь ласка, використовуйте ці функції відповідно.


9
Ця відповідь буде кращою, якби вона включила сюди деякий підсумковий текст щодо висновків щодо пов'язаних переваг ефективності.
2540625

3

substring (): у нього є 2 параметри "start" і "end".

  • Стартовий параметр необхідний і вказує позицію, з якої почати видобуток.
  • Кінцевий параметр необов’язковий і вказує позицію, де слід закінчити видобуток.

Якщо кінцевий параметр не вказаний, всі символи починаються з початкового положення до кінця рядка.

var str = "Substring Example";
var result = str.substring(0, 10);
alert(result);

Output : Substring

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

var str = "Substring Example";
var result = str.substring(10, 0);
alert(result);

Output : Substring

substr () : У нього є 2 параметри "старт" і "підрахунок".

  • Стартовий параметр необхідний і вказує позицію, з якої почати видобуток.

  • Параметр count не є обов'язковим і визначає кількість символів для вилучення.

var str = "Substr Example";
var result = str.substr(0, 10);
alert(result);


Output : Substr Exa

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

var str = "Substr Example";
var result = str.substr(11);
alert(result);

Output : ple


2

підрядка (startIndex, endIndex (не входить у комплект))

substr (startIndex, скільки символів)

const string = 'JavaScript';

console.log('substring(1,2)', string.substring(1,2)); // a
console.log('substr(1,2)', string.substr(1,2)); // av
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.