JSLint говорить про "відсутність параметра радіації"


538

Я запустив JSLint на цьому коді JavaScript, і він сказав:

Проблема в рядку 32 символу 30: Відсутній параметр радіасу.

Це код, про який йдеться:

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, але найкращою практикою є вказівка ​​radix, навіть якщо це значення за замовчуванням, на зразок подібного задаючи визначення "цього" для функції 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 ми можемо прочитати:

Якщо значення radix не визначено або 0 (або відсутнє), JavaScript передбачає наступне:

  • [...]
  • Якщо рядок введення починається з "0", радіас дорівнює восьми (восьмеричним) або 10 (десятковим). Від того, який саме радіакс вибирається, залежить від реалізації. ECMAScript 5 визначає, що використовується 10 (десятковий), але ще не всі браузери підтримують це. З цієї причини завжди вказуйте радіус при використанні parseInt.
  • [...]

Джерело: MDN parseInt ()


1
Так, але компілятор Typescript буде вставляти його, тож навіщо вам турбуватися?
Спок

2
@Spock Тому що TSLint скаржиться, що його там немає. І вниз по кролячій норі ми йдемо ...
msanford

Так правда .. саме тому я просто відключив це правило про підошву. Досі не розумію, чому ОПЦІЯЛЬНИЙ параметр спрацьовує на скаргу. О, добре
Спок

4
@Spock Завжди вказуйте цей параметр, щоб уникнути плутанини читача та гарантувати передбачувану поведінку. Різні реалізації дають різні результати, коли не вказаний радіус, зазвичай значення за замовчуванням до 10. Посилання
Ендрю Лам

27

Ви можете вимкнути це правило, якщо хочете пропустити цей тест.

Вставити:

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 (рядок, радікс);

рядок Значення для розбору Якщо аргумент рядка не є рядком, він перетворюється на рядок (за допомогою абстрактної операції 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" і ви будете вільні від цього попереднього безперешкодного попередження. Це для лайнера eslint.


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.