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

Relaterte artikler