Miten voin määrittää, onko muuttuja merkkijono vai jokin muu JavaScriptissä?
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.
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.
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ää :)