Pārbaudiet, vai mainīgais ir virkne JavaScript

Kā JavaScript var noteikt, vai mainīgais ir virkne vai kas cits?

Tas ir tas, kas man darbojas:

if (typeof myVar === 'string' || myVar instanceof String)
// it's a string
else
// it's something else
Komentāri (34)
Risinājums

Varat izmantot operatoru 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"

Piemērs no šī lapa. (Piemērs ir nedaudz pārveidots).

Tas nedarbosies, kā gaidīts, ja virknes tiks izveidotas ar new String(), bet tas tiek reti izmantots un to ieteicams novērst[1][2]. Ja vēlaties, skatiet citas atbildes par to, kā ar tām rīkoties.


  1. Google JavaScript stila rokasgrāmatā teikts, ka nekad nedrīkst izmantot primitīvo objektu apvalkus.
  2. Douglas Crockford iesaka atteikties no primitīvo objektu apvalkiem.
Komentāri (11)

Labākais veids:

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

Katrs no šiem objektiem ir konstruēts ar atbilstošas klases funkciju, piemēram, "new Object()" utt.

Arī Duck-Typing: Ja tas izskatās kā pīle, staigā kā pīle un smaržo kā pīle - tam jābūt masīvam" Tas nozīmē, ka pārbaudiet tā īpašības.

Ceru, ka tas palīdzēs.

Edit; 12/05/2016

Atcerieties, ka vienmēr varat izmantot arī pieejas kombinācijas. Lūk, piemērs, kā izmantot darbību inline map ar typeof:

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

Lūk'reālāks 'reālās pasaules' inline-mapas izmantošanas piemērs:

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

Šī funkcija izmantotu [ custom ] "type-casting" -- drīzāk "type-/-value-mapping" -- lai noskaidrotu, vai mainīgais patiešām "pastāv". Tagad jūs varat sadalīt šo nepatīkamo matu starp null & amp; 0!

Daudzos gadījumos jums pat nav svarīgs tā tips. Vēl viens veids, kā apiet tipizēšanu, ir kombinēt Duck-Type kopas:

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

Gan Number.prototipam, gan String.prototipam ir .toString() metode. Jūs vienkārši pārliecinājāties, ka skaitļa virknes ekvivalents ir vienāds, un pēc tam pārliecinājāties, ka esat to nodevis http funkcijai kā Numer. Citiem vārdiem sakot, mums pat nebija svarīgi, kāds ir tā tips.

Ceru, ka tas dos jums vairāk darba :)

Komentāri (5)