在JavaScript中使用字符串进行类型检测?

在JavaScript中使用字符串进行类型检测?,javascript,types,instanceof,typeof,Javascript,Types,Instanceof,Typeof,鉴于此: function SomeType () { return this; } 如何仅使用字符串检查对象的类型 如果我有一个构造函数的引用就好了,比如: new SomeType() instanceof SomeType; // true 但是,如果我想将类型检查为字符串,没有简单的方法可以检查 new SomeType() instanceof 'SomeType'; // TypeError 我可以在构造函数转换为字符串后检查它: function SomeType () {

鉴于此:

function SomeType () { return this; }
如何仅使用字符串检查对象的类型

如果我有一个构造函数的引用就好了,比如:

new SomeType() instanceof SomeType; // true
但是,如果我想将类型检查为字符串,没有简单的方法可以检查

new SomeType() instanceof 'SomeType'; // TypeError
我可以在构造函数转换为字符串后检查它:

function SomeType () { return this; }

/function \bSomeType\b/.test( String(new SomeType().constructor) ); // true
但它并不适用于所有场景:

var SomeType = function () { return this; }

/function \bSomeType\b/.test( String(new SomeType().constructor) ); // false

有什么想法吗?试图通过字符串验证类型/构造函数会被视为反模式吗?

如何将其与窗口对象进行比较

new SomeType() instanceof window['SomeType']; // true

这两种说法截然不同。第一个是函数声明,在脚本执行之前提升,并在其定义的整个范围内可用。后者是一个函数表达式,为变量
SomeType
指定一个未命名的匿名函数

在第一种情况下,尝试匹配字符串
“SomeType”
与将对象的构造函数解析为字符串一样简单(
new SomeType().constructor.toString()
)。在后一种情况下,
SomeType
具有非常不同的含义:它是存储匿名函数的变量的名称。您需要一种完全不同的方法来获取对象实例变量的名称,例如通过父对象执行
for..in
循环以获取其属性名称

如果编写代码时假设函数声明和函数表达式在功能上是相同的,那么应该仔细地重新检查代码

如果您只需要检查函数声明(而不是包含函数表达式的变量名称),那么以下是一种可行的方法:


“试图通过字符串验证类型/构造函数会被视为反模式吗?”是。这也是不可能的,正如您在
var SomeType=function(){…}中看到的那样;那个构造函数没有名字,所以你不能检查它。@minitech我也这么认为。我喜欢JavaScript的松散类型,直到它伤害了我。我想到了这一点,但这将在一个高度模块化的节点应用程序中运行,原始构造函数将超出范围。我理解你答案的关键,我已经意识到匿名/命名函数之间的区别;但是我的用例非常微妙。另外,你对命名函数的处理方法基本上与我在问题中概述的方法相同。你是对的,这只是获取相同信息的不同方式。但是我认为您会发现
obj.constructor.toString()
String(obj.constructor)
具有更好的性能。根据我的经验,在当前一代浏览器中,RegEx的优化效果往往很差,但将来可能会发生变化。这里有一个jsperf来处理选项:
function SomeType () { return this; }
var SomeType = function () { return this; };
function isType(obj,name){
    var constructor = obj.constructor.toString();
    return constructor.slice(9,constructor.indexOf("("))===name;
}