Подстрока Javascript возвращает неожиданные результаты [duplicate]

Попробуем другой способ объяснить это ...

Это последовательность, которую JVM проходит, когда вы впервые ссылаетесь на класс MyClass.

  1. Загрузить байт-код в память.
  2. Память для статического хранилища очищается (двоичный ноль).
  3. Инициализировать класс: выполнить каждый статический инициализатор в том порядке, в котором он отображается, включая статические переменные и static { ... }. Затем JVM инициализирует старую переменную myClass в новом экземпляре MyClass. Когда это произойдет, JVM замечает, что MyClass уже загружен (байт-код) и в процессе инициализации, поэтому он пропускает инициализацию. Выделите память на кучу для объекта. Выполнить конструктор. Распечатайте значение obj, которое все еще null (так как оно не является частью инициализированных переменных кучи и конструктора). Когда конструктор заканчивается, выполните следующий статический инициализатор, который устанавливает obj в новый экземпляр Object.
  4. Выполнение инициализации класса. С этого момента все вызовы конструктора будут вести себя так, как вы предполагаете / ожидаете - это obj не будет null, а ссылкой на экземпляр Object.

Помните, что Java указывает, что переменной final присваивается значение один раз. Дело не в том, что гарантированно присваивается значение, когда код ссылается на него, если вы не убедитесь, что код ссылается на него после его назначения.

Это не ошибка. Это определенный способ обработки использования класса во время его собственной инициализации. Если бы это было не так, то JVM переходила бы в бесконечный цикл. См. Шаг № 3.3 (если JVM не пропускает инициализацию для класса, который находится в процессе инициализации, он просто сохранит его инициализацию - бесконечный цикл).

Обратите внимание, что все это происходит на одном и том же который сначала ссылается на класс. Во-вторых, JVM гарантирует, что инициализация завершится до того, как любой другой поток сможет использовать этот класс.

724
задан Difference Engine 19 September 2010 в 12:40
поделиться

8 ответов

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

Ссылки?

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

https://developer.mozilla.org/en/ JavaScript / Справка / Global_Objects / String / подстрока

777
ответ дан Delan Azabani 22 August 2018 в 03:47
поделиться

Slice vs Substr vs Substring vs [] Методы

Для каждого из этих javascript-методов существуют преимущества производительности. Пожалуйста, используйте эти функции соответственно.

4
ответ дан Ali007 22 August 2018 в 03:47
поделиться
  • 1
    Этот ответ был бы лучше, если бы он включал в себя некоторые сводные тексты здесь, в отношении выводов связанных преимуществ производительности, пожалуйста. – jtheletter 19 July 2016 в 21:57

Как было намечено в ответе yatima2975, есть дополнительная разница:

substr() принимает отрицательную стартовую позицию как смещение от конца строки. substring() нет.

Из MDN :

Если начало отрицательное, substr () использует его как индекс символа с конца строки

Итак, суммируем функциональные отличия:

substring(begin-offset, end-offset-exclusive), где начальное смещение - 0 или больше

substr(begin-offset, length), где начальное смещение также может быть отрицательным

26
ответ дан jtheletter 22 August 2018 в 03:47
поделиться

Разница - второй параметр. Их второй параметр, в то время как оба числа ожидают двух разных вещей:

При использовании подстроки второй параметр является первым индексом, который не должен включать:

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'
7
ответ дан Kmeixner 22 August 2018 в 03:47
поделиться

Основное отличие состоит в том, что

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

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

Существуют некоторые дополнительные тонкости между substr () и substring (), такие как обработка равных аргументов и отрицательных аргументов. Также обратите внимание, что substring () и slice () аналогичны, но не всегда одинаковы.

  length vs indices
    "string".substr(2,4);     // "ring" (start, length) length is the maximum length to return
    "string".substring(2,4);  // "ri"   (start, end) indices / second value is NOT inclusive
    "string".slice(2,4);      // "ri"   (start, end) indices / second value is NOT inclusive

  watch out for substring swap
    "string".substr(3,2);     // "in"
    "string".substring(3,2);  // "r"    (swaps the larger and the smaller number)
    "string".slice(3,2);      // ""     (just returns "")

  handling negative arguments
    "string".substr(2,-4);    // ""
    "string".substring(2,-4); // "st"   (converts negative numbers to 0, then swaps first and second position)
    "string".slice(2,-4);     // ""
7
ответ дан Nate Lipp 22 August 2018 в 03:47
поделиться

substr ( MDN ) принимает параметры как (from, length). substring ( MDN ) принимает параметры как (from, to).

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

Вы можете помнить, что substring принимает индексы, как и еще один метод извлечения строки, slice .

При запуске с 0 вы можете использовать любой из этих методов.

255
ответ дан Talgat Medetbekov 22 August 2018 в 03:47
поделиться
  • 1
    .substring() принимает индексы. Вы можете помнить, потому что это единственное имя с именем «i». .slice() также принимает индексы. – colllin 21 January 2014 в 02:36
  • 2
    @colllin, этот комментарий об i и индексы обязательно должен быть перенесен в ответ! – MyDaftQuestions 10 November 2015 в 10:04

Еще одна проблема, с которой я недавно столкнулся, заключается в том, что в IE 8 "abcd".substr(-1) ошибочно возвращает "abcd", тогда как Firefox 3.6 возвращает "d", как и следовало ожидать. slice работает правильно на обоих.

Подробнее об этом разделе можно узнать здесь .

22
ответ дан yatima2975 22 August 2018 в 03:47
поделиться

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

-6
ответ дан 5ervant 22 August 2018 в 03:47
поделиться
  • 1
    Можете ли вы указать на надежный источник, указывающий на устаревание substr()? Я прочитал его от нескольких человек, но я не могу найти какую-либо информацию в Интернете, которая поддерживает это заявление. Кроме того, Mozilla не включает его в список устаревших / устаревших функций: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… – DanielM 8 November 2016 в 11:01
  • 2
    @DanielM Насколько я помню, это было устарело, когда я публиковал этот ответ, возможно, статья изменилась, и теперь она не устарела (но не уверена) .. Но все же записана в некоторых статьях, например, в sstut.com/javascript/substring-method.php как устаревший. – 5ervant 8 November 2016 в 17:02
  • 3
  • 4
  • 5
Другие вопросы по тегам:

Похожие вопросы: