Проверьте, является ли переменная строкой в JavaScript

Как определить, является ли переменная строкой или чем-то еще в JavaScript?

17 ответов


можно использовать typeof оператор:

var booleanValue = true; 
var numericalValue = 354;
var stringValue = "This is a String";
alert(typeof booleanValue) // displays "boolean"
alert(typeof numericalValue) // displays "number"
alert(typeof stringValue) // displays "string"

пример этот сайт. (Пример был немного изменен, хотя).


Это то, что работает для меня:

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

так как 580 + люди проголосовали за неправильный ответ, и 800+ проголосовали за рабочий, но дробовик стиль ответа, я подумал, что может быть стоит переделать мой ответ в более простой форме, что каждый может понять.

function isString(x) {
  return Object.prototype.toString.call(x) === "[object String]"
}

или inline (у меня есть настройка UltiSnip для этого):

Object.prototype.toString.call(myVar) === "[object String]"

к вашему сведению, ответ Пабло Санта-Круса неверен, потому что typeof new String("string") is object

ответ DRAX является точным и функциональным и должен быть правильным ответом (так как Пабло Санта-Круз совершенно определенно неверен, и я не буду спорить против всенародного голосования.)

однако этот ответ также определенно правильный и на самом деле лучший ответ (за исключением, возможно, предложения использовать лодашь/подчеркивание). отказ от ответственности: я внес свой вклад в кодовую базу lodash 4.

мой первоначальный ответ (который, очевидно, пролетел прямо над многими головами) следует:

я расшифровал это из подчеркивать.js:

['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'].forEach( 
    function(name) { 
        window['is' + name] = function(obj) {
              return toString.call(obj) == '[object ' + name + ']';
    }; 
});

это определит isString, isNumber и т. д.


В Узел.Яш, это может быть реализовано как модуль:

module.exports = [
  'Arguments', 
  'Function', 
  'String', 
  'Number', 
  'Date', 
  'RegExp'
].reduce( (obj, name) => {
  obj[ 'is' + name ] = x => toString.call(x) == '[object ' + name + ']';
  return obj;
}, {});

Я рекомендую использовать встроенные функции из jQuery или lodash / подчеркивание. Их проще использовать и легче читать.

любая функция будет обрабатывать случай, упомянутый DRAX... то есть, они и проверьте, является ли (A) переменная строковым литералом или (B) это экземпляр строкового объекта. В любом случае, эти функции правильно определить значение как строку.

лодашь / Подчеркивать.js

if(_.isString(myVar))
   //it's a string
else
   //it's something else

jQuery

if($.type(myVar) === "string")
   //it's a string
else
   //it's something else

посмотреть документация lodash для _.isString () для получения более подробной информации.

посмотреть документация jQuery для $.type () для получения более подробной информации.


function isString (obj) {
  return (Object.prototype.toString.call(obj) === '[object String]');
}

Я видел, что здесь:

http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/


лучшим образом:

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: "Если оно выглядит как утка, ходит как утка и пахнет как утка - это должен быть массив" Значит, проверьте его свойства.

надеюсь, что это помогает.

редактировать; 12/05/2016

помните, что вы всегда можете использовать комбинации подходов. Вот пример использования встроенные карты С typeof на:

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

вот более "реальный мир" пример использования встроенных карт:

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!

много раз вы даже не заботитесь о своем типе. Еще один способ обойти набрав комбинирует наборы утиного типа:

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() method. Вы просто убедились, что строковый эквивалент числа был одинаковым, а затем вы убедились, что передали его в


взяты из лодашь:

function isString(val) {
   return typeof val === 'string' || ((!!val && typeof val === 'object') && Object.prototype.toString.call(val) === '[object String]');
}

console.log(isString('hello world!')); // true
console.log(isString(new String('hello world'))); // true

Мне нравится использовать это простое решение:

var myString = "test";
if(myString.constructor === String)
{
     //It's a string
}

Я также обнаружил, что это тоже отлично работает, и его намного короче, чем другие примеры.

if (myVar === myVar + '') {
   //its string
} else {
   //its something else
}

объединяя пустые кавычки, он превращает значение в строку. Если myVar уже является строкой, тогда оператор if успешен.


Если вы работаете на узле.среда js, вы можете просто использовать встроенную функцию isString в utils.

const util = require('util');
if (util.isString(myVar)) {}

Edit: как упоминалось @Jehy, это устарело с v4.


простым решением было бы:

var x = "hello"

if(x === x.toString(){
// it's a string 
}else{
// it isn't
}

var a = new String('')
var b = ''
var c = []

function isString(x) {
  return x !== null && x !== undefined && x.constructor === String
}

console.log(isString(a))
console.log(isString(b))
console.log(isString(c))

это отличный пример того, почему производительность имеет значение:

выполнение чего-то простого, как тест для строки, может быть дорогостоящим, если не сделано правильно.

например, если бы я хотел написать функцию, чтобы проверить, является ли что-то строкой, я мог бы сделать это одним из двух способов:

1) const isString = str => (Object.prototype.toString.call(str) === '[object String]');

2) const isString = str => ((typeof str === 'string') || (str instanceof String));

оба они довольно striaght вперед,так что может повлиять на производительность? Вообще говоря, функции могут быть дорогим, особенно если вы не знаете, что происходит внутри. В первом примере существует вызов функции для метода toString объекта. Во втором примере нет вызовов функций, так как typeof и instanceof являются операторами. Операторы значительно быстрее, чем вызовы функций.

при тестировании производительности Пример 1 на 79% медленнее, чем Пример 2!

см. тесты:https://jsperf.com/isstringtype


просто расширить на @дран' ответ, Я бы сделал так:

function isWhitespaceEmptyString(str)
{
    //RETURN:
    //      = 'true' if 'str' is empty string, null, undefined, or consists of white-spaces only
    return str ? !(/\S/.test(str)) : (str === "" || str === null || str === undefined);
}

это будет учитывать также nulls и undefined типы, и он позаботится о нестроковых типах, таких как 0.


следующий метод проверит, является ли какая-либо переменная строкой (включая переменные, которые не существуют).

const is_string = value => {
    try {
        return typeof value() === 'string';
    } catch ( error ) {
        return false;
    }
};

let example = 'Hello, world!';

console.log( is_string( () => example ) );                 // true
console.log( is_string( () => variable_doesnt_exist ) );   // false

Я не уверен, что вы имеете в виду, зная, если это тип string независимо от его содержимого, или является ли его содержимое числом или строкой, независимо от его типа.

Поэтому, чтобы узнать, является ли его тип строкой, на это уже ответили.
Но чтобы узнать на основе его содержимого, если его строка или число, я бы использовал это:

function isNumber(item) {
    return (parseInt(item) + '') === item;
}

и для некоторых примеров:

isNumber(123);   //true
isNumber('123'); //true
isNumber('123a');//false
isNumber('');    //false

полный файл утилиты для проверки всех типов переменных.

вот полное решение что не только дает вам базовую функцию util, чтобы узнать, является ли значение строковым объектом или чем-либо еще. Плюс некоторые другие хорошие функции.

этот файл raw используется в моем этом простом проекте react redux на github Простой React Redux

var Sys = {
    /** This Returns Object Type */
    getType: function(val){
        return Object.prototype.toString.call(val);
    },
    /** This Checks and Return if Object is Defined */
    isDefined: function(val){
        return val !== void 0 || typeof val !== 'undefined';
    }
    /** Run a Map on an Array **/
    map: function(arr,fn){
        var res = [], i=0;
        for( ; i<arr.length; ++i){
            res.push(fn(arr[i], i));
        }
        arr = null;
        return res;
    },
    /** Checks and Return if the prop is Objects own Property */
    hasOwnProp: function(obj, val){
        return Object.prototype.hasOwnProperty.call(obj, val);
    },
    /** Extend properties from extending Object to initial Object */
    extend: function(newObj, oldObj){
        for(var prop in oldObj){
            if(hasOwnProp(oldObj, prop)){
                newObj[prop] = oldObj[prop];
            }
        }
        return newObj;
    } }

['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Object', 'Array'].forEach( 
    function(name) { 
        Sys['is' + name] = function(obj) {
              return toString.call(obj) == '[object ' + name + ']';
    };  });

приведенный выше код создаст объект Sys = {} этот метод имеет все функции, такие как getType, isDefined Чтобы использовать их, просто проверьте вызов этого метода.

if(Sys.isDefined(myVar)){ console.log('myVar is defined'); }else { console.log('no myVar is not defined.');}
//Similar to this 
var myStr = 'You are awesome.. !!';
if(Sys.isString(myStr)){console.log(myStr);}