Tarkista, onko muuttuja merkkijono JavaScriptissä

Miten voin määrittää, onko muuttuja merkkijono vai jokin muu JavaScriptissä?

Tämä toimii minulle:

if (typeof myVar === 'string' || myVar instanceof String)
// it's a string
else
// it's something else
Kommentit (34)
Ratkaisu

Voit käyttää typeof-operaattoria:

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"

Esimerkki tältä verkkosivulta. (Esimerkkiä on kuitenkin hieman muokattu).

Tämä ei toimi odotetusti merkkijonojen tapauksessa, jotka on luotu komennolla new String(), mutta sitä käytetään harvoin ja sitä suositellaan vastoin[1][2]. Katso muista vastauksista, miten näitä käsitellään, jos niin haluat.


  1. Googlen JavaScript Style Guide sanoo, ettei koskaan saa käyttää primitiivisten objektien kääreitä.
  2. Douglas Crockford suositteli, että primitiivisten objektien kääreiden käytöstä luovutaan.
Kommentit (11)

Paras tapa:

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');

Kukin näistä on luotu asianmukaisella luokkatoiminnolla, kuten "new Object()" jne.

Myös Duck-Typing: "Jos se näyttää ankalta, kävelee kuin ankka ja haisee kuin ankka - sen täytyy olla Array" Tarkoittaen, tarkista sen ominaisuudet.

Toivottavasti tästä on apua.

Edit; 12/05/2016

Muista, että voit aina käyttää myös lähestymistapojen yhdistelmiä. Tässä'on esimerkki toimintojen inline-kartan käyttämisestä typeof:n kanssa:

var type = { 'number': Math.sqrt.bind(Math), ... }[ typeof datum ];

Tässä'on 'todellisempi 'esimerkki inline-karttojen käytöstä:

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

Tämä funktio käyttäisi [ custom ] "type-casting" -- pikemminkin "type-/value-mapping" -- selvittääkseen, onko muuttuja todella "olemassa". Nyt voit jakaa tuon ikävän hiuksen null & 0 välillä!

Monesti ei edes välitä sen tyypistä. Toinen tapa kiertää tyypittelyä on Duck-Type-sarjojen yhdistäminen:

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) ...;
}

Sekä Number.prototype että String.prototype:lla on .toString()-metodi. Varmistit vain, että numeron merkkijono-ekvivalentti oli sama, ja sitten varmistit, että annoit sen http-funktioon Number:nä. Toisin sanoen, emme edes huolehtineet sen tyypistä.

Toivottavasti tämä antaa sinulle lisää työstettävää :)

Kommentit (5)