如何在JavaScript中使用“instanceof”检查原始字符串(字符串字面量)

66

在JavaScript中,我可以通过以下方式声明一个字符串:

var a = "Hello World";
var b = new String("Hello World");

但a不是String的一个实例...

console.log(a instanceof String); //false;
console.log(b instanceof String); //true;

那么如何查找字符串字面量的类型或“instanceof”呢?

能否强制JavaScript为每个字符串字面量创建一个new String()


1
回答实际问题,如果你真的喜欢使用 instanceof(像我一样,讨厌 typeof == 这种垃圾),你可以在检查它们时轻松地将它们强制转换为对象。将以下代码添加到您的代码中 Object.defineProperty(Object.prototype, '_object', {get:function() { return this; }});,然后 voila,'string'._object instanceof String 返回 true!如果您想要避免原型并创建函数,但这是最优雅的 if 语句。 - Hashbrown
@Hashbrown 这似乎在严格模式下不起作用。在使用严格模式时,是否有其他方法可以使用类似的东西? - The Real Underscore
3个回答

138

使用 typeof "foo" === "string" 代替 instanceof


24
请问,你能解释一下为什么吗? - Ninja Coding
2
@NinjaCoding 基本上,你可以在问题开头提供的链接 https://dev59.com/TXVC5IYBdhLWcg3wtzoQ 中查看更详细的解释。但本质上,String 对象不是原始类型,这就是关键。欢迎来到 js =) - Artur Udod
那样做是行不通的,如果它实际上是一个String((function() { return typeof this; }).call('foo'): object)。这个方法可以同时适用于两种情况。 - Hashbrown
@NinjaCoding 因为这回答了第一个问题:“那么你如何找到字符串字面量的类型或“instanceof”?” - user227353

13

使用typeof代替,并仅比较得到的字符串。 有关详细信息,请参见文档


1
感谢文档链接,但instanceof同样相关:“instanceof运算符测试构造函数的原型是否出现在对象的原型链中。” - jpaugh

5

创建新字符串时不需要编写new String()。当我们编写var x = 'test';语句时,它从原始数据类型创建了x作为字符串。我们无法像使用对象字面量那样将自定义属性附加到这个x上。也就是说,x.custom = 'abc'; x.custom 的值将是未定义的。因此,根据我们的需求,我们需要创建对象。new String()将创建具有typeof()对象而非字符串的对象。我们可以向此对象添加自定义属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接