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


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


1128


источник


Ответы:


Вы можете использовать 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"

Пример из это веб-страница , (Пример был слегка изменен, хотя).

Вот ссылка для typeofоператор.


1059



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

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

1427



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

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

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

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

FYI, ответ Пабло Санта-Крус неверен, потому что typeof new String("string")является object

Ответ DRAX является точным и функциональным и должен быть правильным ответом (поскольку Pablo Santa Cruz определенно некорректен, и я не буду спорить с всенародным голосованием).

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

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

Я перекодировал это из underscore.js:

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

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


В Node.js это может быть реализовано как модуль:

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

90



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

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

lodash / Underscore.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 () Больше подробностей.


74



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

I saw that here:

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


26



You can use this open source reusable is-string component to check if a var is a string while avoiding copy-pasting it.

Examples:

 isString(3) // => false
 isString('') // => true

Also, here is how isString was implemented in AngularJS:

function isString(value) {return typeof value === 'string';}

22



Best way:

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

Each of these has been constructed by its appropriate class function, like "new Object()" etc.

Also, Duck-Typing: "If it looks like a duck, walks like a duck, and smells like a duck - it must be an Array" Meaning, check its properties.

Hope this helps.

Edit; 12/05/2016

Remember, you can always use combinations of approaches too. Here's an example of using an inline map of actions with typeof:

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

Here's a more 'real world' example of using inline-maps:

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

This function would use [ custom ] "type-casting" -- rather, "type-/-value-mapping" -- to figure out if a variable actually "exists". Now you can split that nasty hair between null & 0!

Many times you don't even care about its type. Another way to circumvent typing is combining Duck-Type sets:

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

Both Number.prototype and String.prototype have a .toString() method. You just made sure that the string-equivalent of the number was the same, and then you made sure that you passed it into the http function as a Number. In other words, we didn't even care what its type was.

Hope that gives you more to work with :)


14



Taken from lodash:

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

7



I like to use this simple solution:

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

6



A simple solution would be:

var x = "hello"

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

5