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');
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) ...;
}
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))
17 回答
为了扩展@ DRAX的answer,我会这样做:
它还将考虑
null
和undefined
类型,它将处理非字符串类型,例如0
.我也发现这也很好,而且比其他例子短得多 .
通过连接空引号,它将值转换为字符串 . 如果
myVar
已经是字符串,则if语句成功 .这对我来说已经足够了 .
WARNING: 这不是一个完美的解决方案 . 看到我的帖子的底部 .
你可以像下面这样使用它 .
WARNING: 这种情况在以下情况下工作不正常:
如果您在node.js环境中工作,则可以在utils中使用内置函数isString .
编辑:正如@Jehy所提到的,自v4以来已弃用 .
我喜欢使用这个简单的解决方案:
一个简单的解决方案是:
取自lodash:
我建议使用 jQuery 或 lodash/Underscore 中的内置函数 . 它们使用起来更简单,更易于阅读 .
这两个函数都将处理DRAX提到的情况......也就是说,它们都检查(A)变量是字符串文字还是(B)它是String对象的实例 . 在任何一种情况下,这些函数都正确地将值标识为字符串 .
lodash / Underscore.js
jQuery
有关详细信息,请参阅lodash Documentation for _.isString() .
有关详细信息,请参阅jQuery Documentation for $.type() .
这是性能重要的一个很好的例子:
如果没有正确完成,做一些像字符串测试一样简单的事情可能会很昂贵 .
例如,如果我想编写一个函数来测试某些东西是否为字符串,我可以通过以下两种方式之一来完成:
1)
const isString = str => (Object.prototype.toString.call(str) === '[object String]');
2)
const isString = str => ((typeof str === 'string') || (str instanceof String));
这两个都很直接,所以可能会影响性能?一般来说,函数调用可能很昂贵,特别是如果你不知道里面发生了什么 . 在第一个示例中,有一个对Object的toString方法的函数调用 . 在第二个示例中,没有函数调用,因为typeof和instanceof是运算符 . 运算符明显快于函数调用 .
测试性能时,示例1比示例2慢79%!
看测试:https://jsperf.com/isstringtype
您可以使用
typeof
运算符:this webpage中的示例 . (虽然稍微修改了例子) .
在使用
new String()
创建的字符串的情况下,这将无法正常工作,但这很少用于[1] [2] . 如果您愿意,请参阅其他答案,了解如何处理这些问题 .Google JavaScript样式指南says to never use primitive object wrappers .
道格拉斯·克罗克福德recommended that primitive object wrappers be deprecated .
我在这看到:
http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/
这对我有用:
以下方法将检查是否有任何变量是字符串( including variables that do not exist ) .
由于有580人投票给出了错误答案,800人投票赞成了一个有效但霰弹枪式的答案,我认为以一种每个人都能理解的简单形式重新回答我的答案是值得的 .
或者,内联(我有一个UltiSnip设置):
仅供参考,Pablo Santa Cruz的回答是错误的,因为
typeof new String("string")
是object
DRAX的答案是准确和实用的,应该是正确的答案(因为Pablo Santa Cruz绝对是错误的,我不会反对普遍的投票 . )
但是,这个答案也是绝对正确的,实际上是最好的答案(可能除了建议使用lodash / underscore) . 免责声明:我为lodash 4代码库做出了贡献 .
我的原始答案(显然飞越了很多脑袋)如下:
我从underscore.js转码了这个:
那将定义isString,isNumber等 .
在Node.js中,这可以作为模块实现:
最好的办法:
这些中的每一个都是通过其适当的类函数构造的,如“new Object()”等 .
此外,鸭子打字:“如果它看起来像一只鸭子,像鸭子一样走路,闻起来像一只鸭子 - 它必须是一个数组”意思,检查它的属性 .
希望这可以帮助 .
编辑; 2016年12月5日
请记住,您也可以始终使用方法组合 . 以下是使用typeof的内联动作映射的示例:
这是使用内联映射的更“真实世界”示例:
此函数将使用[custom] "type-casting" - 而不是"type-/-value-mapping" - 来确定变量是否实际为"exists" . 现在你可以在
null
和0
之间拆分那个讨厌的头发!很多时候你甚至不关心它的类型 . 避免打字的另一种方法是组合Duck-Type集:
Number.prototype
andString.prototype
都有一个.toString() method
. 你只是确保数字的字符串等价物是相同的,然后你确保将其作为Number
传递给http
函数 . 换句话说,我们甚至不关心它的类型 .希望能给你更多的工作:)
我'm not sure if you mean knowing if it'是一个类型
string
,无论其内容如何,或者它的内容是数字还是字符串,无论其类型如何 .因此,要知道它的类型是否为字符串,那已经得到了回答 .
但要根据其内容知道它的字符串或数字,我会用这个:
并举例说明: