JSLint dice "parametro radix mancante"


538

Ho eseguito JSLint su questo codice JavaScript e ha detto:

Problema alla riga 32 carattere 30: parametro radix mancante.

Questo è il codice in questione:

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

Cosa c'è che non va qui?

Risposte:


967

È sempre buona norma passare radix con parseInt -

parseInt(string, radix)

Per decimale -

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

Se il parametro radix viene omesso, JavaScript presuppone quanto segue:

  • Se la stringa inizia con "0x", la radice è 16 (esadecimale)
  • Se la stringa inizia con "0", la radice è 8 (ottale). Questa funzione è obsoleta
  • Se la stringa inizia con qualsiasi altro valore, la radice è 10 (decimale)

( Riferimento )


7
Dai suoni di esso, il valore predefinito è 10. Se non inizia con 0x o 0, per impostazione predefinita viene impostata una radice di 10. Ma è consigliabile specificare una radice anche se si tratta del valore predefinito, un po 'come specificando la definizione di "this" in una funzione array.map.
molson504x,

81
è così irragionevole ... secondo quella logica dovrebbe esserci un terzo parametro per rappresentare la radice dell'argomento radix stesso
Nishant,

6
Concordo con altri commentatori. Perché è utile fornire un valore radix quando il valore predefinito è 10? Ciò sfida la convenzione comune.
Richard Clayton,

9
Aggiungi 10 come radice per ottenere un altro errore di lanugine ...Redundant radix parameter
Shanimal

2
@Nishant: l' radixargomento è un valore numerico, non una rappresentazione di stringa di un valore numerico, quindi non è necessario specificare una radice.
tokland,

79

Per evitare questo avviso, invece di utilizzare:

parseInt("999", 10);

Puoi sostituirlo con:

Number("999");


Si noti che parseInt e Number hanno comportamenti diversi , ma in alcuni casi, uno può sostituire l'altro.


4
Ci sono anche grandi differenze di prestazioni tra parseInte Number. Ecco un vecchio test delle prestazioni .
Josh Unger,

3
Chrome 77: Number()è 6 volte più veloce diparseInt()
Zanon il

1
Questa è una soluzione pulita che funziona bene.
thanos.a

43

Non sto rispondendo correttamente alla domanda ma, penso che abbia senso chiarire perché dovremmo specificare il radix .

Sulla documentazione MDN possiamo leggere che:

Se radix non è definito o 0 (o assente), JavaScript presuppone quanto segue:

  • [...]
  • Se la stringa di input inizia con "0", radix è otto (ottale) o 10 (decimale). L'esatta scelta di radix dipende dall'implementazione. ECMAScript 5 specifica che viene utilizzato 10 (decimale), ma non tutti i browser lo supportano ancora. Per questo motivo, specificare sempre una radice quando si utilizza parseInt.
  • [...]

Fonte: MDN parseInt ()


1
Sì, ma il compilatore Typescript lo inserirà, quindi perché dovresti preoccuparti?
Spock,

2
@Spock Perché TSLint si lamenta che non c'è. E giù nella
tana

Sì, è vero ... ecco perché disabilito semplicemente questa regola. Ancora non capisco perché un parametro OPZIONALE faccia scattare una lamentela per i pelucchi .. vabbè
Spock

4
@Spock Specifica sempre questo parametro per eliminare la confusione del lettore e garantire un comportamento prevedibile. Diverse implementazioni producono risultati diversi quando non viene specificata una radice, di solito il valore predefinito è 10. Riferimento
Andrew Lam

27

Puoi disattivare questa regola se desideri saltare quel test.

Inserire:

radix: false

Sotto la rulesproprietà " " nel tslint.jsonfile.

Non è consigliabile farlo se non capisci questa eccezione.


1
Lo userò dal momento che il codice gira bene senza radix
William

22

L'aggiunta di quanto segue sopra il file JS indica a JSHint di sopprimere l'avviso radix:

/*jshint -W065 */

Vedi anche: http://jshint.com/docs/#options


2
A quale opzione jshint corrisponde? Sto usando SublimeLint per eseguire jshint nel mio editor e ci vuole solo un hash di opzione: coppie di valori per l'impostazione, quindi non credo di poter applicare il tuo suggerimento "-W065".
Dihedral,

5
È possibile utilizzare "-W065": true, ad esempio in un .jshintrcfile.
alexfernandez,

29
-1 Per favore non farlo, aggiungi solo la radice in cui vuoi analizzare
Juan Mendes,

Più un linguaggio è fortemente tipizzato, maggiori sono le opportunità di ottimizzazione del compilatore, motivo per cui sta lanciando l'avvertimento.
HoldOffHunger,

3
nella moderna JS, l'aggiunta di IMO al radix rende in realtà più poco chiaro cosa sta facendo la funzione. È nella posizione che potresti aspettarti che vada in default se non conosci la firma della funzione. Non ha senso specificare una radice.
Charles Offenbacher

5

L'ho risolto semplicemente usando + foo, per convertire la stringa.

Tieni presente che non è eccezionale per la leggibilità (correzione sporca).

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

3

Puoi anche semplicemente aggiungere questa linea proprio sopra la tua linea di analisi:

// eslint-disable-next-line

Questo disabiliterà il controllo eslint per la riga successiva. Usa questo se hai solo bisogno di saltare una o due righe.


2

Basta inserire una stringa vuota nella posizione radix, perché parseInt () accetta due argomenti:

parseInt (string, radix);

stringa Il valore da analizzare. Se l'argomento stringa non è una stringa, viene convertito in una stringa (utilizzando l'operazione astratta ToString). Lo spazio bianco iniziale nell'argomento stringa viene ignorato.

radix Un numero intero compreso tra 2 e 36 che rappresenta la radice (la base nei sistemi matematici numerici) della stringa sopra menzionata. Specificare 10 per il sistema numerico decimale comunemente usato dall'uomo. Specificare sempre questo parametro per eliminare la confusione del lettore e garantire un comportamento prevedibile. Diverse implementazioni producono risultati diversi quando non viene specificata una radice, in genere il valore predefinito è 10.

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


2

Aggiungi semplicemente la tua regola personalizzata in .eslintrc che assomiglia a quello "radix": "off" e sarai libero da questo esile avvertimento privo di preoccupazioni. Questo è per la linter eslint.


1

Prima di ECMAScript 5, parseInt () rilevava automaticamente anche i valori letterali ottali, il che causava problemi perché molti sviluppatori presumevano che uno 0 iniziale sarebbe stato ignorato.

Quindi invece di:

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

Fai questo:

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

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

var num = parseFloat(someValue); 

Riferimento


0

Invece di chiamare la substringfunzione che potresti usare.slice()

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

Qui, -1 in slice indica che per avviare slice dall'ultimo indice.

Grazie.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.