Проверка дали дадена променлива е низ в JavaScript

Как мога да определя дали дадена променлива е низ или нещо друго в JavaScript?

Ето какво работи за мен:

if (typeof myVar === 'string' || myVar instanceof String)
// it's a string
else
// it's something else
Коментари (34)
Решение

Можете да използвате оператора 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"

Пример от тази уебстраница. (Примерът обаче е леко променен).

Това няма да работи както се очаква в случай на низове, създадени с new String(), но това се използва рядко и се препоръчва да не се[1][2]. Вижте другите отговори за това как да се справите с тях, ако желаете.


  1. В Ръководството за стила на Google JavaScript се казва, че никога не трябва да се използват обвивки за примитивни обекти.
  2. Дъглас Крокфорд препоръчва примитивните обвивки на обекти да бъдат премахнати.
Коментари (11)

Най-добър начин:

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

Всеки от тези обекти е конструиран чрез съответната функция на класа, като "new Object()" и т.н.

Също така, Duck-Typing: Ако изглежда като патица, ходи като патица и мирише като патица - трябва да е масив" В смисъл, проверете свойствата му.

Надявам се това да помогне.

Edit; 12/05/2016

Не забравяйте, че винаги можете да използвате и комбинации от подходи. Ето един пример за използване на инлайн карта на действията с typeof:

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

Ето един по-'реален пример за използване на inline-карти:

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

Тази функция ще използва [ custom ] "type-casting" -- по-скоро "type-/-value-mapping" -- за да разбере дали дадена променлива действително "съществува". Сега вече можете да разделите неприятния косъм между null & 0!

В много случаи не ви интересува дори нейният тип. Друг начин за заобикаляне на типизирането е комбинирането на Duck-Type множества:

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

Както прототипът Number.prototype , така и прототипът String.prototype имат метод .toString(). Вие просто сте се уверили, че символът на числото, еквивалентен на низ, е един и същ, и след това сте се уверили, че сте го предали във функцията http като Number. С други думи, ние дори не се интересувахме какъв е типът му.

Надявам се, че това ви дава повече възможности за работа :)

Коментари (5)