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 ведут себя по- разному , но в некоторых случаях один может заменить другой.

Zanon
источник
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 ()

nmoliveira
источник
1
Да, но компилятор Typescript вставит его, так зачем вам беспокоиться?
Спок
2
@ Спок Потому что TSLint жалуется, что его там нет. И вниз по кроличьей норе мы идем ...
msanford
Да, правда .., поэтому я просто отключил это правило. До сих пор не понимаю, почему НЕОБЯЗАТЕЛЬНЫЙ параметр отключает жалобу на ворс .. ну да ладно
Спок
4
@Spock Всегда указывайте этот параметр, чтобы избежать путаницы читателя и гарантировать предсказуемое поведение. Разные реализации дают разные результаты, когда основание не указано, обычно значение по
Эндрю Лам
28

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

Вставка:

radix: false

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

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

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

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

/*jshint -W065 */

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

aleemb
источник
2
Какой опции jshint это соответствует? Я использую SublimeLint для запуска jshint в моем редакторе, и для его установки требуется только хэш параметра: пары значений, поэтому я не думаю, что смогу применить ваше предложение "-W065".
Диэдральный
5
Вы можете использовать "-W065": true, например, в .jshintrcфайле.
alexfernandez
29
-1 Пожалуйста, не делайте этого, просто добавьте основание, которое вы хотите проанализировать
Хуан Мендес
Чем жестче типизирован язык, тем больше возможностей для оптимизации компилятора, поэтому он выдает предупреждение.
HoldOffHunger
3
в современном JS, добавление в основание IMO фактически делает более неясным, что делает функция. Он находится в том положении, в котором вы можете ожидать перехода по умолчанию, если не знаете сигнатуру функции. Нет смысла указывать основание.
Чарльз Оффенбахер
5

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

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

console.log( +'1' )
// 1 (int)
user2369834
источник
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;

Ahmed.Dz
источник
2

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

Goran_Ilic_Ilke
источник
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); 

Ссылка

SanTom
источник
0

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

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

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

Спасибо.

Даниил
источник