javascript - Hvordan gjøre om NaN fra parseInt til 0 for en tom streng?


Er det på en eller annen måte mulig å returnere 0 i stedet for NaN når man parser verdier i JavaScript?

I tilfelle den tomme strengen returnerer parseInt NaN.

Er det mulig å gjøre noe slik i JavaScript for å sjekke etter NaN?

var value = parseInt(tbb) == NaN ? 0 : parseInt(tbb)

Eller kanskje det finnes en annen funksjon eller jQuery-plugin som kan gjøre noe lignende?

Svar #1

var s = '';
var num = parseInt(s) || 0;

Når den ikke brukes med boolske verdier, returnerer logiske OR ||-operatoren det første uttrykket parseInt(s) hvis det kan evalueres til true, ellers returnerer den det andre uttrykket 0. Returverdien av parseInt('') er NaN. NaN evalueres til false, så num ender opp med å bli satt til 0.

Svar #2

Du kan også bruke isNaN()-funksjonen:

var s = ''
var num = isNaN(parseInt(s)) ? 0 : parseInt(s)

Svar #3

Problemet

Andre svar tar ikke hensyn til at 0 er falsy, og dermed vil følgende være 20 i stedet for 0:

const myNumber = parseInt('0') || 20; // 20

Løsningen

Jeg foreslår en hjelpefunksjon som løser de fleste problemene:

function getNumber({ value, defaultValue }) {
  const num = parseInt(value, 10);
  return isNaN(num) ? defaultValue : num;
}

Hjelpefunksjonen vil gi følgende resultater:

getNumber({ value: "0", defaultValue: 20 }); // 0
getNumber({ value: "2", defaultValue: 20 }); // 2
getNumber({ value: "2.2", defaultValue: 20 }); // 2
getNumber({ value: "any string", defaultValue: 20 }); // 20
getNumber({ value: undefined, defaultValue: 20 }); // 20
getNumber({ value: null, defaultValue: 20 }); // 20
getNumber({ value: NaN, defaultValue: 20 }); // 20
getNumber({ value: false, defaultValue: 20 }); // 20
getNumber({ value: true, defaultValue: 20 }); // 20

Svar #4

Jeg ble overrasket over å ikke se noen nevne bruk av Number(). Det er riktig at den vil tolke desimaltall dersom det gis, så den oppfører seg annerledes enn parseInt(), men den antar allerede base 10 og vil gjøre om "" eller til og med " " til 0.

Svar #5

For folk som ikke er begrenset til parseInt, kan du bruke bitvis ELLER-operatoren (som implisitt kaller ToInt32 på operandene sine).

var value = s | 0;

// NaN | 0     ==>> 0
// ''  | 0     ==>> 0
// '5' | 0     ==>> 5
// '33Ab' | 0  ==>> 0
// '0x23' | 0  ==>> 35
// 113 | 0     ==>> 113
// -12 | 0     ==>> -12
// 3.9 | 0     ==>> 3

Merk: ToInt32 er forskjellig fra parseInt. (dvs. parseInt('33Ab') === 33)

Relaterte artikler