在JS中,我们有两种方法来检查给定值是否为字符串:
function isString1(value) {
return typeof value === 'string';
}
function isString2(value) {
return Object.prototype.toString.call(value) === "[object String]";
}
这是有效的实施,为什么?
谢谢!
答案 0 :(得分:3)
这取决于您是否要考虑使用String
构造函数创建的字符串,例如
new String("hello");
第一种方法将为纯字符串返回true
,为构造字符串返回false
:
typeof "hello" === "string" // true
typeof new String("hello") === "string" // false
而第二种方法在两种情况下都会返回true
:
Object.prototype.toString.call("hello") === "[object String]" // true
Object.prototype.toString.call(new String("hello")) === "[object String]" // true
使用构造的字符串并不常见,因此对于大多数实际用途,您可以使用更简单的方法。
值得注意的是,如果某人修改Object.prototype.toString
(顺便说一句,这是一件很邪恶的事情),第二种方法的行为可能会发生变化。如果有人这样做,例如:
Object.prototype.toString = function(){ return "This is evil"; }
然后
Object.prototype.toString.call("hello") === "This is evil"
typeof
运算符已融入语法中,并且不易受此影响。