检查一个variables是否是JavaScript中的一个string

我如何确定一个variables是否是一个string或JavaScript中的其他东西?

你可以使用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运算符的参考。

这对我有用:

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

我build议使用jQuerylodash / Underscore的内置函数。 他们更简单易用,更易于阅读。

两个函数都会处理DRAX提到的情况…也就是说,它们检查(A)variables是string文字还是(B)它是String对象的实例。 在任何一种情况下,这些函数都可以正确地将该值标识为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()的文档 。

有关更多详细信息,请参阅$ .type()的jQuery文档 。

由于580多人投了一个不正确的答案,800多人投了一个工作,但猎枪式的答案,我认为这可能是值得重做我的答案在一个更简单的forms,大家可以理解。

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

或者,内联(我有一个UltiSnip设置为此):

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

仅供参考,Pablo Santa Cruz的答案是错误的,因为typeof new String("string")object

DRAX的答案是准确和实用的,应该是正确的答案(因为帕布罗圣克鲁斯绝对是不正确的,我不会反对民众投票)。

但是,这个答案也是绝对正确的,实际上是最好的答案(除了使用lodash / 下划线的build议外)。 免责声明:我对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等。

PS。 如果有人可以重写,以在非浏览器上下文(例如node.js)工作?

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

我在这里看到:

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

你可以使用这个开源的可重用的is-string组件来检查一个var是否是一个string,同时避免复制粘贴它。

例子:

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

另外,这里是如何在AngularJS中实现isString

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

最好的办法:

 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()”等。

另外,鸭子打字:“如果它看起来像一只鸭子,像鸭子走路,闻起来像一只鸭子 – 它必须是一个arrays”的意思,检查它的属性。

希望这可以帮助。

编辑; 2016年12月5日

请记住,你总是可以使用方法的组合。 下面是一个使用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”来判断一个variables是否真的存在。 现在你可以在null0之间分割那些讨厌的头发!

很多时候, 你甚至不关心它的types 。 另一种规避打字的方法是将鸭式套装组合在一起:

 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 。 你只要确保数字的string相同,然后你确保你把它作为一个Number传递给http函数。 换句话说,我们甚至不在乎它的types是什么。

希望能给你更多的工作:)

一个简单的解决scheme是:

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

从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 

如果你在node.js环境下工作,你可以简单地在utils中使用内build函数isString。

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

编辑:作为@Jehy提到,这是从第4版已弃用。

我也发现这个工作也很好,比其他例子短得多。

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

通过连接空引号将值转换为string。 如果myVar已经是一个string,那么if语句是成功的。

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

只要扩展@ DRAX的答案 ,我会这样做:

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

它也将解释为nullundefinedtypes,它将处理非stringtypes,如0

完整的实用程序文件检查所有types的variables。

这里是完整的解决scheme ,它不仅为您提供基本的util函数来查找值是否是String对象或其他东西。 再加上其他一些好的function。

这个原始文件被用在我的这个简单的反应redux项目在github简单的反应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 + ']'; }; }); 

上面的代码会创build一个对象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);} 

这是一个简单的伎俩。 “使用charAt”

 var string1 = "hello world"; var string2 = String("hello world"); var string3 = new String("hello world"); (string1.charAt && string2.charAt && string3.charAt) && true == true //true ((1).charAt || ({}).charAt || ([]).charAt ) || false == true // false 

你可以使用charAt来处理每个string格式,而其他的则是false。 但是null会导致错误。

我不知道你的意思是不pipe它的内容是否是一个typesstring ,或者它的内容是一个数字还是string,而不pipe它的types如何。

所以要知道它的types是否是一个string,这已经被回答了。
但要知道它的内容,如果它的string或数字,我会用这个:

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

举一些例子:

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

我喜欢使用这个简单的解决scheme:

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