javascript - 检查变量的类型

标签 javascript

确定变量是否为字符串(以及数字、 bool 值等)的最佳方法是什么?

通常你会发现:

function isString(value) {
    return typeof value === 'string';
}

但是人们忘记了也可以直接使用 var foo = new String("bar"); 创建字符串对象- 这是否是个好主意是完全不同的事情。

那么到这里怎么走呢?我可以想到 - 并且已经看到 - 各种方法(有些简化):

// option 1
function isString(value) {
    return (typeof value === 'string') ||
           /^function String\(\)/.test(value.constructor + '');
}

// option 2
function isString(value) {
    return (typeof value === 'string') ||
           (value.constructor === String);
}

// option 3
function isString(value) {
    return (typeof value === 'string') ||
           value instanceof String;
}

是否有解决此问题的“最佳”方法?或者它们都是等价的?

最佳答案

在现有的三个选项中,第一个对我来说感觉很老套,因为它使用正则表达式来测试 value.constructor 的字符串表示形式。它有效,但仍然感觉很糟糕(也许只有我是这样)。

第二个选项仅适用于字符串字面值、通过连接现有对象和使用 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

但是,与第三个选项不同,它可能不适用于具有继承自 String()String() 以外的构造函数的对象。

我的答案以字符串为例来反射(reflect)问题,但同样的想法适用于NumberBooleanFunction对象数组等类型。

关于javascript - 检查变量的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4828535/

相关文章:

javascript - jQuery 用户界面 : smooth slider with one snap (to default value)?

javascript - 防止元素获得焦点

javascript - 如何向切换添加过渡?

javascript - React 16.3+ 从状态变化触发 onChange 的正确方法

javascript - 我们如何在不使用 Redux 的情况下在 react-native 中实现撤消/重做、图像旋转和放大和缩小方法

javascript - 如何解析和显示 TVML 文件中的 JSON 数据

javascript - 尝试防止 DIV 中出现重复的随机项

javascript - 从 javascript 调用 Rails 操作

JavaScript 正则表达式下划线不起作用

PHP 动态数据库插入