写点什么

别再被坑了! JavaScript 类型检测的最佳实践

作者:Immerse
  • 2024-08-16
    广东
  • 本文字数:1875 字

    阅读完需:约 6 分钟

别再被坑了! JavaScript类型检测的最佳实践

别再被坑了! JavaScript 类型检测的最佳实践

在 JavaScript 中,我们经常需要判断一个变量的类型。这个需求在编程中非常常见,因为不同类型的数据会影响到我们的代码逻辑。


JavaScript 提供了几种方法来检测数据类型,每种方法都有自己的优缺点。

Object.prototype.toString.call()

这是最万能的方法。它可以准确识别所有的 JavaScript 内置类型,包括基本类型和复杂类型。不管你给它传什么数据,它都能给出一个统一格式的字符串,告诉你这个数据到底是什么类型。


它的原理是调用对象内部的 [[Class]] 属性。这个属性是只读的,不能被改写,所以非常可靠。


优点:


  • 识别范围广,基本类型和复杂类型都能识别

  • 不会受到对象自身的 toString() 方法的影响

  • 返回结果格式统一,方便解析


缺点:


  • 写起来比较啰嗦

  • 如果是自定义类型,只能得到 [object Object],不能进一步区分类型


function detectType(data) {    return Object.prototype.toString.call(data).slice(8, -1).toLowerCase();}
console.log(detectType(123)); // 'number'console.log(detectType('abc')); // 'string'console.log(detectType(true)); // 'boolean'console.log(detectType(null)); // 'null'console.log(detectType(undefined)); // 'undefined'console.log(detectType([])); // 'array'console.log(detectType({})); // 'object'console.log(detectType(function () {})); // 'function'console.log(detectType(new Date())); // 'date'console.log(detectType(new RegExp())); // 'regexp'console.log(detectType(new Error())); // 'error'
复制代码

typeof

这个运算符最常用,写起来简单。它可以识别基本类型和函数,但对复杂类型的识别能力有限。


优点:


  • 使用简单

  • 可以识别基本类型和函数


缺点:


  • 无法区分数组和普通对象

  • typeof null 的结果是 'object'

  • 无法识别内置对象类型,如 DateRegExp


console.log(typeof 123); // 'number'console.log(typeof 'abc'); // 'string'console.log(typeof true); // 'boolean'console.log(typeof undefined); // 'undefined'console.log(typeof null); // 'object' (这是一个历史遗留的 bug)console.log(typeof []); // 'object'console.log(typeof {}); // 'object'console.log(typeof function () {}); // 'function'
复制代码

instanceof

instanceof 运算符用于测试构造函数的 prototype 属性是否出现在对象的原型链中的任何位置。


优点:


  • 可以检查对象是否属于特定的类或构造函数


缺点:


  • 只能检查对象类型,不能检查基本类型

  • 要识别多种类型,需要多次调用


console.log([] instanceof Array); // trueconsole.log({} instanceof Object); // trueconsole.log(function () {} instanceof Function); // trueconsole.log(new Date() instanceof Date); // trueconsole.log(new RegExp() instanceof RegExp); // trueconsole.log(new Error() instanceof Error); // true
console.log(123 instanceof Number); // falseconsole.log('abc' instanceof String); // falseconsole.log(true instanceof Boolean); // false
复制代码

constructor

constructor 是对象的一个属性,指向创建该对象的构造函数。可以用它来判断对象的类型。


优点:


  • 可以识别大多数对象类型,包括自定义类型


缺点:


  • 如果对象的 constructor 属性被修改,会得到错误结果

  • nullundefined 没有 constructor 属性


console.log((123).constructor === Number); // trueconsole.log('abc'.constructor === String); // trueconsole.log(true.constructor === Boolean); // trueconsole.log([].constructor === Array); // trueconsole.log({}.constructor === Object); // trueconsole.log(function () {}.constructor === Function); // trueconsole.log(new Date().constructor === Date); // trueconsole.log(new RegExp().constructor === RegExp); // trueconsole.log(new Error().constructor === Error); // true
复制代码

总结

如果需要全面准确的类型识别,Object.prototype.toString.call() 是最佳选择。如果只需要简单区分基本类型,typeof 就足够了。如果要检查对象是否属于特定类型,可以用 instanceof


在实际应用中,我们可以根据具体需求选择合适的方法。

结语

上次我开发了一个工具,可以批量清理无用的仓库。如果你感兴趣,可以去看看哦!😊


介绍文章https://mp.weixin.qq.com/s/t7lgc6b7xJiNhfm5vWo5-A


GitHub 仓库地址https://github.com/yaolife ng0629/del-repos


如果你觉得这个工具对你有所帮助,请不要忘记给我的 GitHub 仓库 点个 Star ⭐!你的支持是我前进的动力!


感谢阅读,我们下次再见!



发布于: 刚刚阅读数: 3
用户头像

Immerse

关注

还未添加个人签名 2021-10-17 加入

还未添加个人简介

评论

发布
暂无评论
别再被坑了! JavaScript类型检测的最佳实践_JavaScript_Immerse_InfoQ写作社区