检查一个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议使用jQuery或lodash / 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是否真的存在。 现在你可以在null
和0
之间分割那些讨厌的头发!
很多时候, 你甚至不关心它的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); }
它也将解释为null
和undefined
types,它将处理非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 }