JSLint говорит «отсутствует параметр радиуса»


538

Я запустил JSLint для этого кода JavaScript, и он сказал:

Проблема в строке 32, символ 30: отсутствует параметр radix.

Это код вопроса:

imageIndex = parseInt(id.substring(id.length - 1))-1;

Что здесь не так?

Ответы:


967

Всегда полезно передавать radix с parseInt -

parseInt(string, radix)

Для десятичной -

parseInt(id.substring(id.length - 1), 10)

Если параметр radix опущен, JavaScript предполагает следующее:

  • Если строка начинается с «0x», основание будет 16 (шестнадцатеричное)
  • Если строка начинается с «0», основание будет 8 (восьмеричное). Эта функция устарела
  • Если строка начинается с любого другого значения, основание будет 10 (десятичное)

( Ссылка )


7
Исходя из этого, по умолчанию IS 10. Если оно не начинается с 0x или 0, по умолчанию используется основание 10. Но лучше всего указывать основание, даже если это значение по умолчанию, вроде как указание определения «this» для функции array.map.
— molson504x

81
это так неразумно ... по этой логике должен быть третий параметр, представляющий основание самого аргумента
— основа

6
Согласитесь с другими комментаторами. Почему полезно указывать значение радиуса, если по умолчанию установлено значение 10? Это противоречит общему соглашению.
— Ричард Клейтон

9
Добавьте 10 как основание, чтобы получить еще одну ошибку ворса ...Redundant radix parameter
— Shanimal

2
@Nishant: radixаргумент является числовым значением, а не строковым представлением числового значения, поэтому не нужно указывать основание.
— Tokland

79

Чтобы избежать этого предупреждения, вместо использования:

parseInt("999", 10);

Вы можете заменить его на:

Number("999");


Обратите внимание, что parseInt и Number ведут себя по- разному , но в некоторых случаях один может заменить другой.


4
Существуют также большие различия в производительности между parseIntи Number. Вот старый тест производительности .
— Джош Унгер

3
Chrome 77: Number()в 6 раз быстрееparseInt()
— Zanon

1
Это чистое решение, которое отлично работает.
— thanos.a

43

Я не правильно отвечаю на вопрос, но, думаю, имеет смысл пояснить, почему мы должны указывать основание .

В документации MDN мы можем прочитать, что:

Если основание не определено или 0 (или отсутствует), JavaScript предполагает следующее:

  • [...]
  • Если входная строка начинается с «0», основание будет восемь (восьмеричное) или 10 (десятичное). Какое именно основание выбрано, зависит от реализации. ECMAScript 5 указывает, что используется 10 (десятичное число), но пока не все браузеры поддерживают это. По этой причине всегда указывайте основание при использовании parseInt.
  • [...]

Источник: MDN parseInt ()


1
Да, но компилятор Typescript вставит его, так зачем вам беспокоиться?
— Спок

2
@ Спок Потому что TSLint жалуется, что его там нет. И вниз по кроличьей норе мы идем ...
— msanford

Да, правда .., поэтому я просто отключил это правило. До сих пор не понимаю, почему НЕОБЯЗАТЕЛЬНЫЙ параметр отключает жалобу на ворс .. ну да ладно
— Спок

4
@Spock Всегда указывайте этот параметр, чтобы избежать путаницы читателя и гарантировать предсказуемое поведение. Разные реализации дают разные результаты, когда основание не указано, обычно значение по
— Эндрю Лам

28

Вы можете отключить это правило, если хотите пропустить этот тест.

Вставка:

radix: false

Под rulesсвойством " " в tslint.jsonфайле.

Не рекомендуется делать это, если вы не понимаете это исключение.


1
Я собираюсь использовать это, так как код работает очень хорошо без оснований
— Уильям

22

Добавление следующего в верхней части вашего файла JS скажет JSHint подавить предупреждение по основанию:

/*jshint -W065 */

Смотрите также: http://jshint.com/docs/#options


2
Какой опции jshint это соответствует? Я использую SublimeLint для запуска jshint в моем редакторе, и для его установки требуется только хэш параметра: пары значений, поэтому я не думаю, что смогу применить ваше предложение "-W065".
— Диэдральный

5
Вы можете использовать "-W065": true, например, в .jshintrcфайле.
— alexfernandez

29
-1 Пожалуйста, не делайте этого, просто добавьте основание, которое вы хотите проанализировать
— Хуан Мендес

Чем жестче типизирован язык, тем больше возможностей для оптимизации компилятора, поэтому он выдает предупреждение.
— HoldOffHunger

3
в современном JS, добавление в основание IMO фактически делает более неясным, что делает функция. Он находится в том положении, в котором вы можете ожидать перехода по умолчанию, если не знаете сигнатуру функции. Нет смысла указывать основание.
— Чарльз Оффенбахер

5

Я решил это с помощью + foo, чтобы преобразовать строку.

Имейте в виду, что это не очень хорошо для удобочитаемости

console.log( +'1' )
// 1 (int)

3

Вы также можете просто добавить эту строку прямо над строкой parseInt:

// eslint-disable-next-line

Это отключит проверку eslint для следующей строки. Используйте это, если вам нужно пропустить только одну или две строки.


2

Просто поместите пустую строку в основную точку, потому что parseInt () принимает два аргумента:

parseInt (string, radix);

строка Значение для анализа. Если строковый аргумент не является строкой, он преобразуется в строку (используя абстрактную операцию ToString). Ведущие пробелы в строковом аргументе игнорируются.

radix Целое число от 2 до 36, представляющее основание (основание в математических системах счисления) вышеупомянутой строки. Укажите 10 для десятичной системы счисления, обычно используемой людьми. Всегда указывайте этот параметр, чтобы избежать путаницы читателя и гарантировать предсказуемое поведение. Разные реализации дают разные результаты, когда основание не указано, обычно значение по умолчанию равно 10.

imageIndex = parseInt (id.substring (id.length - 1)) - 1;
imageIndex = parseInt(id.substring(id.length - 1), '')-1;


2

Просто добавьте свое пользовательское правило в .eslintrc, которое выглядит следующим образом, "radix": "off" и вы будете свободны от этого ненужного предупреждения. Это для Эслинт Линтер.


1

До ECMAScript 5 parseInt () также автоматически определял восьмеричные литералы, что вызывало проблемы, поскольку многие разработчики предполагали, что ведущий 0 будет игнорироваться.

Так что вместо:

var num = parseInt("071");      // 57

Сделай это:

var num = parseInt("071", 10);  // 71

var num = parseInt("071", 8);

var num = parseFloat(someValue); 

Ссылка


0

Вместо вызова substringфункции вы можете использовать.slice()

    imageIndex = parseInt(id.slice(-1)) - 1;

Здесь -1 в срезе указывает, что начинать срез с последнего индекса.

Спасибо.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.