如何确定变量是字符串还是JavaScript中的其他内容?
这就是我的工作:
1 2 3 4
| if (typeof myVar === 'string' || myVar instanceof String)
// it's a string
else
// it's something else |
- "myvar instanceof string"是否在"typeof myvar=='string'"之上或之外执行任何操作?
- 如果我没有错,type of将类型的名称作为字符串("string"、"integer"…)返回,而instanceof比较实际类型。我现在不记得了,但我认为在某些情况下,typeof可以返回"string"以外的内容,这就是为什么要进行双重检查。
- @我记得。在JavaScript中,可以有字符串的变量类型或字符串类的对象类型(相同的东西-都是字符串-但定义不同),这就是为什么要进行双重检查。
- var somevar=new string('somestring')console.log(typeof somevar)//对象
- 刚刚测试过:alert(new string()instanceof string);在firefox中返回true(而alert(new object()instanceof string);返回false)。
- -1因为这里的EDOCX1[7]检查是无意义的噪声,除非您遵循一些非常不寻常的编码实践,而这个答案无法解释它的作用或您可能使用它的原因。你需要它的唯一原因是如果你使用对象包装的字符串,但是对象包装的字符串是一个没有人使用的毫无价值的功能,谷歌和Crockford都谴责这是一种糟糕的做法(google styleguide.googlecode.com/svn/trunk/…,crockford.com/javascript/recommended.html)。
- 另外,如果您在代码中使用对象包装字符串是出于某种疯狂的原因,那么值得注意的是,这里的函数不适用于跨帧代码;它不会识别从另一帧中得到的对象包装字符串,因为它们的构造函数将是从另一帧中得到的postMessaged,因为它们的构造函数将是Stringglobal。这是一个不可能的假设情况,但是由于你已经在你的解决方案中增加了复杂性来处理那些使用对象包装字符串的人的不可能的假设情况,所以我认为指出它是合理的。
- 实际上,对于一般用法,应该使用原始String。但是,在某些情况下,使用String的实例更有用。例如,使用String时,性能关键代码的执行速度实际上比原始代码快。pastebin.com/kawht0ep
- 总而言之,我不会将原始包装器称为"无用的特性",而且提供的代码一点也不罕见。他们有自己的用例。
- 我强烈反对正确处理不太可能发生的情况的可靠代码是应该避免的。检查typeof和instanceof,如果您的代码可能被其他人调用,这是一个很好的建议。@如果你问"我刚才是什么东西?",Markamery的postMessageedge case很重要。-但是您希望在接口上处理它,并且不允许传播。在其他地方,处理不推荐使用的编码方法似乎是正确的,即使一些JS唯美主义者不赞成它们。不要将代码注释为接受字符串,除非它确实接受!
- 也就是说,我可能更喜欢@ling的回答,因为它也处理了Markamery的问题…
- 也许凌的回答更简洁,但有两件事你需要记住:1。有人可以修改Object.prototype.toString方法和中断代码(这是不太可能发生的,但仍然是…)2。执行速度要慢得多。
- 我想你可以用myVar.constructor === String来代替这个条件,它适用于两种情况:myVar ="Foobar"或myVar = new String("Foobar")。
- 这是一个有趣的技巧,但是如果有人创建String实例并更改构造函数,那么它将被破坏,反之亦然(创建String以外的任何东西的实例,然后将构造函数设置为String)。这两种情况都不太可能发生,但我更喜欢创建健壮的代码。另外,您还需要检查myVar是否为空。
- @MichaelTheirot这里的问题不仅仅是是否存在可以想象的用例,在这些用例中,instanceof检查是有用的(当然,如果您有足够的创造力,也有一些检查是有害的),而是使用它是否比忽略它更正确。这个问题询问如何检查变量是否是字符串。对象包装字符串是字符串吗?如果我知道就去他妈的。尚不清楚在语义上,这种结构应该被视为代表什么,这就是为什么它们不应该首先出现在语言中,并且样式指南建议永远不要使用它们。
- @Markamery您是否考虑过编辑此答案以包含您的评论中的信息?从本质上讲,它可以说只是使用typeof……除非您想防范那些特别糟糕的编码实践,这些实践几乎没有人使用,也没有人应该使用,在这种情况下,您可以包括check实例?也许你或者运营商可以考虑添加这些信息?
- @Markamery使用字符串对象有一些非常规的好处。如果您没有执行严格的相等/将它们放到switch语句中(属性查找速度更快),我看不到排除它们的原因。
- 我同意这是在检查"噪音",但这是正确的答案。让我兴奋的是,不要把这个移到最上面,因为它显然有更多的上票。
- var obj=new string("some value")真的是字符串吗?log(obj)更像是一个char数组。字符串用字符串("some value")(不带new关键字)实例化,typeof string(something)的计算结果为"string"。
- @没有new关键字,轮胎不会被实例化。使用String(someValue)用于将值(如数字)转换为字符串,而不是用于创建。
- @Danubiansailor就是个很好的例子,它缺少分号。有趣的是,如果省略新关键字,则会得到一个"string":var str=string("");console.log(typeof str,str instanceof string);//string false
- if(str.trim) {}是一个非常简单的黑客,适用于所有场景。检查是否存在trim,该方法只是字符串原型的一部分。
- let a:any = 'some string'; console.log(a instanceof String)在我的机器上产生false。
- 谷歌。克洛克福德好吧,不管怎样。这个答案使用JavaScript语言的基本语法和运算符。它显示了对手头基本情况的真正理解。胜利者。
- …如果!!('some string', String)返回true。
- @达彻:除非我遗漏了什么,否则('some string', String)总是会返回String,不管第一个论点的类型如何,这总是正确的。
- @马修,你说得很对,当我发这个帖子的时候,可能是醉了,后来发现了我的错误。
- @bryc这并不是所有场景都适用。对于非String具有名为trim的方法或属性是完全有效的。
- @Matthew可能不是FutureProof;如果数组曾经使用过trim方法,那么在将数组与字符串进行比较时,它将不再工作。但它仍然是获取用于检查字符串的真实值的最短方法。
- @bryc我认为您只考虑内置类型。由您或库定义的任何[proto]类型都可以具有trim方法或属性,以及任意对象。
您可以使用typeof运算符:
1 2 3 4 5 6 7 8
| 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]。如果您愿意,请参阅其他答案以了解如何处理这些问题。
谷歌javascript风格指南说永远不要使用原始对象包装器。
道格拉斯·克罗克福德建议不要使用原始对象包装器。
- @Wolfy87请注意,有些情况下,typeofStringValue可能返回"object"而不是"string"。查看对我答案的评论。
- 我的首选答案。反对它的理由是,它"失败"的对象包装字符串,如new String('foo'),但这并不重要,因为对象包装字符串是一个无用的功能,你不应该使用。谷歌风格指南禁止他们,道格拉斯·克罗克福德希望他们被否决,没有图书馆使用他们。假装它们不存在,毫无恐惧地使用typeof。
- 道格拉斯·克罗克福德是否也建议不推荐使用typeof?
- @丹妮尔,因为他提出了一个替代方案来解决一些问题,而不是因为他原则上反对。
- @你怎么知道他原则上不反对?我所知道的是,这些问题正是他建议不赞成当前执行typeof的原因。
- 让value=nan;typeof value=>‘number’js完全吸收。
- @markamery这样声明string的用例是什么?好像是不好的做法。
- @MarekMarczak不确定我是否理解:NaN是一个特殊的IEEE浮点值,在使用IEEE浮点的每种编程语言中都应该被认为是一个数字,如果您将其插入更多的数学语句中,该值表示它将产生未定义的行为。就像无穷大。
- @Mike'Pomax'Kamermans也许Nan类型在科学计算中有用,代表无穷大,但在日常编程中,它会引起头痛。
- 如果它导致您头痛,99.99%的时间是因为您没有正确地构造代码。这不是Nan的错,因为存在和做它所做的,这是你应该注意的,从中学习,并记住下一次使用可能产生它的代码时。
- 如果你们,伙计们,看看nodejs的'path'模块代码,你们会发现只有if (typeof path !== 'string')模块[1][2]。试想一下,这个模块有多少用户,没有人抱怨对象包装器的问题!
既然有580多人投票赞成一个错误的答案,800多人投票赞成一个有效但枪炮式的答案,我认为以一种大家都能理解的简单形式重做我的答案是值得的。
1 2 3
| function isString(x) {
return Object.prototype.toString.call(x) ==="[object String]"
} |
或者,内联(我对此有一个ultisnip设置):
1
| Object.prototype.toString.call(myVar) ==="[object String]" |
拜托,帕布罗·圣克鲁斯的回答是错误的,因为埃多克斯1〔9〕是埃多克斯1〔10〕。
德拉克斯的回答是准确和实用的,应该是正确的答案(因为帕布罗·圣克鲁斯绝对是错误的,我不会反对大众的投票。)
然而,这个答案也是绝对正确的,而且实际上是最好的答案(可能除了建议使用lodash/下划线)。免责声明:我贡献了洛达什4代码库。
我最初的回答(显然是从很多人的头上飞过)如下:
我从underline.js转码:
1 2 3 4 5 6
| ['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'].forEach(
function(name) {
window['is' + name] = function(obj) {
return toString.call(obj) == '[object ' + name + ']';
};
}); |
这将定义IsString、IsNumber等。
在node.js中,这可以作为一个模块实现:
1 2 3 4 5 6 7 8 9 10 11
| module.exports = [
'Arguments',
'Function',
'String',
'Number',
'Date',
'RegExp'
].reduce( (obj, name) => {
obj[ 'is' + name ] = x => toString.call(x) == '[object ' + name + ']';
return obj;
}, {}); |
- 您建议使用underline.js(有什么奇怪的原因?)但你在这里不用。此外,函数还会污染全局命名空间。在node.js中,您将创建一个具有所有这些功能的模块(您可以使用global || window而不是window,但这将是解决您不应该首先遇到的问题的一种糟糕方法)。
- @我来找欧普问题的答案,但不喜欢任何答案。所以我检查了下划线做了什么,并认为它足够漂亮,可以提取和修改一点(以避免加载下划线库)。我将澄清我的职位。
- @奥韦洛菲尔酷,我明白了,你最初的回答是这样措辞的,就像你在暗示下划线本身。就我个人而言,我只需要检查myObject+"" === myObject来检查对象是否是字符串(或者更好的是,我不会首先在行为驱动的类型系统中键入check)。
- @BenjamingRuenbaum好吧,我想我建议使用下划线:)我发现当我使用自己的方法(就像你刚刚发布的方法)时,我倾向于在不同的代码片段中使用不同的检查。最终,我会变得多疑,认为某个特定的变量可能是不正确的,最后我会进行双重检查、重写等。因此,对我来说,一个确定的iswhatever()意味着我可以保持一致,如果结果是错的,我只能将它更改一个位置。另外,我可以用其他语言创建匹配函数(我现在正在做bash),并有一个一致的命名约定。
- @Benjamingruenbaum myObject+"" === myObject在myObject = new String("string")的情况下不起作用。你必须使用myObject instanceof String。见德拉克斯的回答
- @在这种情况下,utopik是不一样的,原始值和包装值是不一样的。String对象的行为与字符串原语值类型完全不同(例如,尝试添加属性)。德拉克斯在这方面的回答是错误的。
- DRAX的答案可能只在原型继承上下文中是错误的,这取决于您试图实现什么。在其他情况下,这是正确的
- 对于关注系统架构的人来说,这是一个很酷的解决方案。
- FYI。对NaN来说是错误的。检查。toString.call(1-"a") =>"[object Number]"。但实际上是江户十一〔六〕。
- @绿色的NaN仍然是Number的一个例子,特别是Number.NaN的例子。typeof NaN还返回"数字",以防其他人感到疑惑。不管怎样,它不是一个字符串,这就是这个问题的意义所在。
- 有趣的是,array.is array正在成为一个标准函数,其推荐的垫片实现与Object.prototype.toString.call(arg) == '[object Array]'相同。我不明白为什么一个相同的方法不应该作为String.isString = function(arg){return Object.prototype.toString.call(arg) == '[object String]';}存在,它只是起作用。我喜欢迭代为函数、数字等其他类定义这些。但为什么会污染全局命名空间?为什么不跟随array.isarray的前导,将它们作为"静态"方法添加到相应的类型上?
- 事实上,这正是我所感兴趣的。我有一个编辑器(vim)宏,它将isAnything扩展到Object.prototype.toString.call(arg) == '[object ${Anything}],所以我总是被覆盖,即使我需要一些罕见的东西,比如isArguments。
- @奥韦洛菲勒,这怎么比德拉克斯的回答更好呢?
- 对象的toString呈现是否标准化?或者,未来符合标准的浏览器是否可以实现Object.ToString作为呈现"[Dude its an Object!]"的对象?
- @是的。还要注意,因为我们使用toString.call(),所以不能使用类似x = { toString: () => '[object Number]' }的东西来开发它。
- JS支持monkey补丁,因此可以在Object.prototype中重新定义toString。所以,我认为,依赖toString来检查对象的类型,充其量是一种糟糕的做法。
- 这个答案看起来很完整,但我很好奇这对typeof的表现。
我建议使用jquery或lodash/underline中的内置函数。它们使用起来更简单,也更容易阅读。
任何一个函数都将处理所提到的DRAX情况…也就是说,它们都检查(a)变量是字符串文字还是(b)它是字符串对象的实例。在这两种情况下,这些函数都正确地将值标识为字符串。
lodash/下划线.js
1 2 3 4
| if(_.isString(myVar))
//it's a string
else
//it's something else |
JQuery
1 2 3 4
| if($.type(myVar) ==="string")
//it's a string
else
//it's something else |
有关详细信息,请参阅lodash文档以获取.isstring()。
有关更多详细信息,请参阅jquery文档中的$.type()。
- 这是JS社区问题的本质所在——针对原语类型的检查是一条单行线,只涉及语言构造(基本类型之一),但您建议使用外部库。如果有人已经使用了这些库中的一个,这可能是一个好主意,但是下载它们只是为了这个,而不是简单地检查类型是一个过度的杀伤力。
- 我同意拉法尔的观点。我到处都看到它提高了使用这些外部库之一的"可读性"。如果您知道javascript,那么这比您没有使用的外部库更容易阅读。一开始使用_.every()有点混乱,像_.isBoolean()这样简单的东西使我公司的开发人员感到困惑。一个开发人员错误地认为,如果值是布尔值且为假,则为假。对我来说,英语比德语更容易阅读,因为我不懂德语。学习javascript,一切都会变得有意义。
- 拉法?WRZESZCZ这些库被广泛使用,并提供了许多有用的(和经过测试的)功能。尤其是罗达什。我不建议有人下载这个库只用于这个解决方案……但我建议每个JavaScript开发人员下载这个库,看看他们遗漏了什么。;)
- 在生产环境中,您希望事情尽可能快地工作,虽然库显著地缩短了开发时间,但它可以通过添加一个抽象层来增加应用程序的复杂性。每个开发人员都必须研究库来使用它,而不是"简单"的语言结构。要点是:如果你要为你的应用程序使用一个库,只有当你知道你要做两个或三个以上的一行程序或这种类型的"检查"时才添加它:)
- 如果不是真正需要,您不应该使用第三方库!
- 你们都错过了像罗达什这样的图书馆:不是速度。不是"易于发展"。使用像lodash这样的库的原因提供了"防御性",以抵御那些会破坏您的JS应用程序的问题。当您试图对对象执行字符串操作(反之亦然)时,就会发生致命错误,而lodash为防止这些错误提供了巨大的价值。
- 请记住,许多人将在类似节点或节点的环境中执行此操作,很少有人将在那里使用jquery。
1 2 3
| function isString (obj) {
return (Object.prototype.toString.call(obj) === '[object String]');
} |
我在这里看到了:
http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/
- 我认为这个解决方案是最强大的,因为它可以处理答案中提供的URL中提到的跨帧/跨窗口引用场景。
- 很好的答案,看起来underline.js也使用了这个方法!
- @凌只是好奇,你为什么在Object.prototype.toString.call(obj) === '[object String]'上加括号?
- @顽固的花哨,我想是为了代码的可读性。
- @你是说(x === y)的可读性比x === y好?
- @在我看来,这是一种顽固的炫耀。这也是关于一致性的。我个人在返回值时总是使用括号。
- 这与@orwellophile的答案有什么不同?
- @谢尔约翰,奥韦洛菲勒的回答被编辑了
最佳方式:
1 2 3 4 5 6 7 8
| 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输入:如果它看起来像一只鸭子,走路像一只鸭子,闻起来像一只鸭子,那一定是一个阵列。意思是,检查它的属性。
希望这有帮助。
编辑:12/05/2016
记住,您也可以使用各种方法的组合。下面是使用类型为的操作的内联映射的示例:
1
| var type = { 'number': Math.sqrt.bind(Math), ... }[ typeof datum ]; |
下面是使用内联映射的更"真实"的示例:
1 2 3 4 5
| 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 |
此函数将使用[自定义]"类型转换"(而不是"类型-值映射")来确定变量是否实际"存在"。现在你可以把那讨厌的头发分给null和0!
很多时候你甚至不在乎它的类型。另一种避免输入的方法是组合duck类型集:
1 2 3 4 5 6
| 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。您只需确保与数字等效的字符串是相同的,然后确保将其作为Number传递到http函数中。换句话说,我们甚至不在乎它的类型。
希望能给你更多的工作机会:)
- 您将需要对普通旧数字进行其他检查,因为尝试获取其构造函数属性将失败:
- @刚刚在铬合金控制台里,Torazaburo对我来说工作得很好。是什么让你觉得它行不通?
- @Torazaburo你可能想玩断言((o.constructor === Number || s.constructor === Boolean))。相传,parseInt和NaN是脆弱但强大的工具。请记住,非数字不是非数字,可以定义未定义。
- a.constructor===数组错误,有时会失败,请使用array.isarray请参阅web.mit.edu/jwalden/www/isarray.html
- 同意,这不是故障保险。更好的方法是使用属性检查——这是目前唯一真正的防故障方法。示例:if(thing.call) { 'its a function'; }或if(thing.defineProperties) { 'its an object'; }。谢谢你的意见,阿克斯基伯!
我喜欢使用这个简单的解决方案:
1 2 3 4 5
| var myString ="test";
if(myString.constructor === String)
{
//It's a string
} |
- 这与4年后科迪的回答有什么不同?
- @谢尔约翰·科迪的回答很好。我的回答(全文)简短明了。你问…:)
我真的不明白为什么在这种情况下人们不简单地使用typeof:
1 2 3
| if (typeof str === 'string') {
return 42;
} |
是的,它对对象包装的字符串(如new String('foo'))会失败,但这些被广泛认为是一种糟糕的实践,大多数现代开发工具可能会阻碍它们的使用。(如果你看到了,就把它修好!)
Object.prototype.toString技巧是所有前端开发人员都被发现在他们的职业生涯中有一天会犯下的错误,但不要让它用它的聪明来愚弄你:一旦猴子修补了对象原型,它就会崩溃:
1 2 3 4 5 6 7
| const isString = thing => Object.prototype.toString.call(thing) === '[object String]';
console.log(isString('foo'));
Object.prototype.toString = () => 42;
console.log(isString('foo')); |
取自罗达什:
1 2 3 4 5 6
| 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 |
这就是为什么性能很重要的一个很好的例子:
如果做得不正确,做一些像测试字符串这样简单的事情可能会很昂贵。
例如,如果我想编写一个函数来测试某个东西是否是字符串,我可以用以下两种方法之一进行测试:
1)江户十一〔1〕号
2)江户十一〔2〕
这两个方面都是非常直接的,那么什么可能影响性能呢?一般来说,函数调用可能很昂贵,特别是如果您不知道内部发生了什么。在第一个示例中,有一个对对象的ToString方法的函数调用。在第二个示例中,没有函数调用,因为typeof和instanceof是运算符。运算符比函数调用快得多。
测试性能时,示例1比示例2慢79%!
请参见测试:https://jspef.com/isstringtype
- 测试链接已经死了,但我相信你。这种信息非常重要。如果不是最乐观的答案,至少应该是对当前领先答案最乐观的评论。
- typeof str === 'string' || str instanceof String(可以去掉括号,在if (..)的情况下我更喜欢使用括号);不管怎样,检查2中的原始类型和对象类型都是清楚和充分的。无论如何,这些支票应该是"罕见的"。
如果您在node.js环境中工作,您可以简单地使用内置函数isString-in-utils。
1 2
| const util = require('util');
if (util.isString(myVar)) {} |
编辑:正如@jehy所提到的,这是自v4以来被否决的。
- 自v4以来已弃用:nodejs.org/api/util.html util诳u isstring_对象
- 有替代品吗?
- 文件上说"使用typeof value === 'string'"。
我还发现这个方法也很有效,而且比其他例子短得多。
1 2 3 4 5
| if (myVar === myVar + '') {
//its string
} else {
//its something else
} |
通过连接空引号,它将值转换为字符串。如果myVar已经是一个字符串,那么if语句是成功的。
- 唯一的问题是,当您想要检查变量的类型时,您正在强制它。与typeof相比,这似乎有点贵。
- 是的,你说得对。JSperf表示,它比typeof慢20%左右,但仍比toString快得多。不管怎样,我想我只是喜欢强迫的语法。
- 这不适用于字符串类型;var s = new String('abc'); > s === s + '' > false。
- 不适用于创建object类型的new Stringcus。w3schools.com/js/tryit.asp?文件名=tryjs_string_object2
- 好主意,但不留边盒的物件包线。
1 2 3 4 5 6 7 8 9 10 11
| 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)) |
- 如果x.constructor==string还将为null或undefined返回false,为什么需要检查null或undefined?
- @朱尔斯曼森:它会抛出一个错误,而不会产生false。
以下方法将检查是否有任何变量是字符串(包括不存在的变量)。
1 2 3 4 5 6 7 8 9 10 11 12
| 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 |
一个简单的解决方案是:
1 2 3 4 5 6 7
| var x ="hello"
if(x === x.toString(){
// it's a string
}else{
// it isn't
} |
- 这不会检查它是否是字符串。它构成一个字符串,很多东西都有toString()函数
- @Muhammadumer是的,它将其转换为字符串,然后对照原始值检查标识,只有原始值也是字符串时才会是真的。
- 这是错误的:您不能盲目地对任何值调用.toString;如果要检查的x为空或未定义,则您的代码抛出异常
- 这个想法仍然有用。x==string(x)安全有效。
- @noris在你的if声明中缺少)。
为了进一步了解@drax的答案,我会这样做:
1 2 3 4 5 6
| 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类型,并将处理非字符串类型,如0。
您可以使用此函数确定任何内容的类型:
1 2 3
| var type = function(obj) {
return Object.prototype.toString.apply(obj).replace(/\[object (.+)\]/i, '$1').toLowerCase();
}; |
这对我来说已经足够好了。
警告:这不是一个完美的解决方案。请看我的帖子底部。
1 2 3 4 5 6
| Object.prototype.isString = function() { return false; };
String.prototype.isString = function() { return true; };
var isString = function(a) {
return (a !== null) && (a !== undefined) && a.isString();
}; |
你可以这样使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| //return false
isString(null);
isString(void 0);
isString(-123);
isString(0);
isString(true);
isString(false);
isString([]);
isString({});
isString(function() {});
isString(0/0);
//return true
isString("");
isString(new String("ABC")); |
警告:这在以下情况下工作不正确:
1 2 3 4 5 6 7
| //this is not a string
var obj = {
//but returns true lol
isString: function(){ return true; }
}
isString(obj) //should be false, but true |
我不确定你的意思是知道它是否是string类型,不管它的内容是什么,或者它的内容是数字还是字符串,不管它的类型是什么。所以为了知道它的类型是否是字符串,已经回答过了。但为了根据它的内容知道它是一个字符串还是一个数字,我将使用这个:
1 2 3
| function isNumber(item) {
return (parseInt(item) + '') === item;
} |
例如:
1 2 3 4
| isNumber(123); //true
isNumber('123'); //true
isNumber('123a');//false
isNumber(''); //false |
- 我想我最初是在问如何检查类型,尽管那时我甚至不知道如何形成这个问题。(我可能只是使用/^\d+$/.test('123')来完成这项工作,以避免潜在解析问题的复杂性)