Hvordan kan jeg afgøre, om en variabel er en streng eller noget andet i JavaScript?
Du kan bruge operatoren typeof
:
var booleanValue = true;
var numericalValue = 354;
var stringValue = "This is a String";
var stringObject = new String( "This is a String Object" );
alert(typeof booleanValue) // displays "boolean"
alert(typeof numericalValue) // displays "number"
alert(typeof stringValue) // displays "string"
alert(typeof stringObject) // displays "object"
Eksempel fra denne webside. (Eksemplet blev dog ændret en smule).
Dette vil ikke fungere som forventet i tilfælde af strenge oprettet med new String()
, men dette bruges sjældent og anbefales mod[1][2]. Se de andre svar for hvordan du håndterer disse, hvis du ønsker det.
Bedste måde:
var s = 'String';
var a = [1,2,3];
var o = {key: 'val'};
(s.constructor === String) && console.log('its a string');
(a.constructor === Array) && console.log('its an array');
(o.constructor === Object) && console.log('its an object');
(o.constructor === Number || s.constructor === Boolean) && console.log('this won\'t run');
Hver af disse er blevet konstrueret af den relevante klassefunktion, som "new Object()" osv.
Også Duck-Typing: "Hvis den ligner en and, går som en and og lugter som en and - må det være en Array" Betydning, tjek dens egenskaber.
Jeg håber, at dette hjælper.
Husk, du kan altid bruge kombinationer af tilgange også. Her'er et eksempel på at bruge et inline map af handlinger med typeof:
var type = { 'number': Math.sqrt.bind(Math), ... }[ typeof datum ];
Her er et mere 'real world' eksempel på brug af inline-maps:
function is(datum) {
var isnt = !{ null: true, undefined: true, '': true, false: false, 0: false }[ datum ];
return !isnt;
}
console.log( is(0), is(false), is(undefined), ... ); // >> true true false
Denne funktion ville bruge [ custom ] "type-casting" -- snarere "type-/-value-mapping" -- til at finde ud af, om en variabel faktisk "eksisterer". Nu kan du dele det grimme hår mellem null
& 0
!
Mange gange er du du ikke engang ligeglad med dens type*. En anden måde at omgå typning på er at kombinere Duck-Type-sæt:
this.id = "998"; // use a number or a string-equivalent
function get(id) {
if (!id || !id.toString) return;
if (id.toString() === this.id.toString()) http( id || +this.id );
// if (+id === +this.id) ...;
}
Både Number.prototype
og String.prototype
har en .toString() metode
. Du har bare sørget for, at nummerets string-ækvivalent var det samme, og så har du sørget for at sende det ind i http
-funktionen som et Number
. Med andre ord var vi ikke engang interesseret i, hvad dets type var.
Håber det giver dig mere at arbejde med :)