找出变量是否为字符串的最佳方法是什么(同样,数字,布尔值等)是什么?
通常你会发现:
function isString(value) {
return typeof value === 'string';
}
Run Code Online (Sandbox Code Playgroud)
但人们忘记了也可以直接使用创建字符串对象var foo = new String("bar");- 这是否是一个好主意是完全不同的事情.
那么去这里的方式是什么?我能想到 - 并且已经看到 - 各种方法(有些简化):
// option 1
function isString(value) {
return (typeof value === 'string') ||
/^function String\(\)/.test(value.constructor + '');
}
Run Code Online (Sandbox Code Playgroud)
要么
// option 2
function isString(value) {
return (typeof value === 'string') ||
(value.constructor === String);
}
Run Code Online (Sandbox Code Playgroud)
要么
// option 3
function isString(value) {
return (typeof value === 'string') ||
value instanceof String;
}
Run Code Online (Sandbox Code Playgroud)
有没有"最佳"的方式来解决这个问题?或者它们都相同?
在现有的三个选项中,第一个选项对我来说相当粗俗,因为它使用正则表达式来测试字符串表示value.constructor.它有效,但它仍然感觉hacky(也许它只是我).
第二个选项只适用于字符串文字,通过连接现有对象和使用new String()构造函数创建的对象创建的字符串,而第三个选项应该适用于使用new String()构造函数或继承的任何其他对象创建的对象String() (我不确定JavaScript继承;有人可以证实这一点吗?).
该constructor属性也存在于原语/文字中,而不仅仅是使用创建的包装器对象new.这使得typeof第二个选项的检查非常多余:
function isString(value) {
return value.constructor === String;
}
alert(isString("test1")); // true
alert(isString(new String("test2"))); // true
Run Code Online (Sandbox Code Playgroud)
但是,与第三个选项不同,它可能不适用于具有除String()继承之外的构造函数的对象String().
我的答案使用字符串作为一个例子来反映这个问题,但同样的想法适用于Number,Boolean,Function,Object,Array和其他类型.
| 归档时间: |
|
| 查看次数: |
284 次 |
| 最近记录: |