javascript - JSLint sier «mangler radix-parameter»
Jeg kjørte JSLint på denne JavaScript-koden, og det sa:
Problem på linje 32 tegn 30: Manglende radix-parameter.
Dette er koden det gjelder:
imageIndex = parseInt(id.substring(id.length - 1))-1;
Hva er galt her?
Svar #1
Det er alltid en god praksis å oppgi radix med parseInt -
parseInt(string, radix)
For desimal -
parseInt(id.substring(id.length - 1), 10)
Hvis radix-parameteren utelates, antar JavaScript følgende:
- Hvis strengen begynner med "0x", er basen 16 (heksadesimal)
- Hvis strengen begynner med "0", er basen 8 (oktall). Denne funksjonen er utdatert
- Hvis strengen begynner med en hvilken som helst annen verdi, er basen 10 (desimal)
(Referanse)
Svar #2
For å unngå denne advarselen, i stedet for å bruke:
parseInt("999", 10);
Du kan erstatte det med:
Number("999");
Merk at parseInt og Number har forskjellig oppførsel, men i noen tilfeller kan den ene erstatte den andre.
Svar #3
Jeg svarer ikke riktig på spørsmålet, men jeg synes det gir mening å klargjøre hvorfor vi bør spesifisere basen.
I MDN-dokumentasjonen kan vi lese at:
Hvis radix er udefinert eller 0 (eller fraværende), antar JavaScript følgende:
- [...]
- Hvis inndatastrengen begynner med "0", er tallsystemet åtte (oktal) eller 10 (desimal). Hvilket tallsystem som velges er avhengig av implementeringen. ECMAScript 5 spesifiserer at 10 (desimal) skal brukes, men ikke alle nettlesere støtter dette ennå. Av denne grunn bør du alltid angi et tallsystem når du bruker parseInt.
- [...]
Kilde: MDN parseInt()
Svar #4
Du kan slå av denne regelen hvis du ønsker å hoppe over den testen.
Sett inn :
radix: false
Under «rules»-egenskapen i tslint.json-filen.
Det anbefales ikke å gjøre det hvis du ikke forstår denne unntaket.
Svar #5
Å legge til følgende øverst i JS-filen din vil fortelle JSHint å undertrykke radix-advarselen:
/*jshint -W065 */
Se også: http://jshint.com/docs/#options
Svar #6
Før ECMAScript 5, autodetekte parseInt() også oktalliteraler, noe som forårsaket problemer fordi mange utviklere antok at en ledende 0 ville bli ignorert.
Så i stedet for:
var num = parseInt("071"); // 57
Gjør dette:
var num = parseInt("071", 10); // 71
var num = parseInt("071", 8);
var num = parseFloat(someValue);
Referanse
