协慌网

登录 贡献 社区

检查变量是否是 JavaScript 中的字符串

如何确定变量是否是 JavaScript 中的字符串或其他内容?

答案

这对我有用:

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

您可以使用typeof运算符:

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] 。如果您愿意,请参阅其他答案,了解如何处理这些问题。


  1. Google JavaScript 样式指南说从不使用原始对象包装器
  2. Douglas Crockford 建议弃用原始对象包装器

由于 580 多人投票给出了不正确的答案,800 多人投票赞成了一个有效但霰弹枪式的答案,我认为以一种每个人都能理解的简单形式重新回答我的答案是值得的。

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 的答案是准确和实用的,应该是正确答案(因为 Pablo Santa Cruz 绝对是错误的,我不会反对普遍的投票。)

但是,这个答案也绝对正确,实际上是最好的答案(可能除了建议使用lodash / underscore )。 免责声明:我为 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;
}, {});