Как мога да определя дали дадена променлива е низ или нещо друго в JavaScript?
Ето какво работи за мен:
if (typeof myVar === 'string' || myVar instanceof String)
// it's a string
else
// it's something else
Можете да използвате оператора 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]. Вижте другите отговори за това как да се справите с тях, ако желаете.
Най-добър начин:
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: Ако изглежда като патица, ходи като патица и мирише като патица - трябва да е масив" В смисъл, проверете свойствата му.
Надявам се това да помогне.
Не забравяйте, че винаги можете да използвате и комбинации от подходи. Ето един пример за използване на инлайн карта на действията с 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
. С други думи, ние дори не се интересувахме какъв е типът му.
Надявам се, че това ви дава повече възможности за работа :)