别再被坑了! 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'- 无法识别内置对象类型,如
Date、RegExp等
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); // true
console.log({} instanceof Object); // true
console.log(function () {} instanceof Function); // true
console.log(new Date() instanceof Date); // true
console.log(new RegExp() instanceof RegExp); // true
console.log(new Error() instanceof Error); // true
console.log(123 instanceof Number); // false
console.log('abc' instanceof String); // false
console.log(true instanceof Boolean); // false
constructor
constructor 是对象的一个属性,指向创建该对象的构造函数。可以用它来判断对象的类型。
优点:
- 可以识别大多数对象类型,包括自定义类型
缺点:
- 如果对象的
constructor属性被修改,会得到错误结果 null和undefined没有constructor属性
console.log((123).constructor === Number); // true
console.log('abc'.constructor === String); // true
console.log(true.constructor === Boolean); // true
console.log([].constructor === Array); // true
console.log({}.constructor === Object); // true
console.log(function () {}.constructor === Function); // true
console.log(new Date().constructor === Date); // true
console.log(new RegExp().constructor === RegExp); // true
console.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 !你的支持是我前进的动力!
感谢阅读,我们下次再见!

别再被坑了! JavaScript类型检测的最佳实践的更多相关文章
- 谈谈JavaScript类型检测
javascript内置的类型检测机制并非完全可靠.比如typeof操作符,并不能准确的判断数据是哪个类型,比如:数组和对象就不能通过typeof来区分. typeof [] ==="o ...
- JavaScript best practices JS最佳实践
JavaScript best practices JS最佳实践 0 简介 最佳实践起初比较棘手,但最终会让你发现这是非常明智之举. 1.合理命名方法及变量名,简洁且可读 var someItem = ...
- JavaScript 类型 检测
前言 ECMAScript中有5种数据类型,分别为Number,Boolean,Null,Undifined和String,以及一种复杂的数据类型Object(由名值对组成,是这门语言所有对象的基础类 ...
- Javascript类型检测
原地址 http://www.cnblogs.com/fool/archive/2010/10/07/javascrpt.html 开门见山,我们先来看一下代码: var is = function ...
- javascript 类型检测
javascript数据类型分为简单数据类型和复杂数据类型.简单数据类型分为string,number,boolean,defined,null,复杂数据类型为Object.类型检测在写代码可能会非常 ...
- JavaScript类型检测汇总
曾经我以为JavaScript中的类型检测只要使用 typeof 或 instanceof 就可以通通解决.后来我发现我是too young too naive啊!早说过JavaScript是 ...
- JavaScript类型检测, typeof操作符与constructor属性的异同
*#type.js function Person(name, age) { this.name = name; this.age = age; } var d = {an: 'object'}; v ...
- JavaScript——类型检测
要检测一个变量是否是基本数据类型,可以用 Typeof 操作符.如果我们想知道它是什么类型的对象,我们可以用instanceof 操作符,语法如下所示: result=variable instanc ...
- [笔记]《JavaScript高级程序设计》- 最佳实践
一.可维护性 1 什么是可维护的代码 可理解性--其他人可以接受代码并理解它的意图和一般途径,而无需原开发人员的完整解释. 直观性--代码中的东西一看就能明白,不管其操作过程多么复杂. 可适应性--代 ...
- JavaScript的技巧和最佳实践
JavaScript是一个绝冠全球的编程语言,可用于Web开发.移动应用开发(PhoneGap.Appcelerator).服务器端开发 (Node.js和Wakanda)等等.JavaScript还 ...
随机推荐
- 详解Web应用安全系列(1)注入漏洞之SQL注入
注入漏洞通常是指在可输入参数的地方,通过构造恶意代码,进而威胁应用安全和数据库安全.常见的注入漏洞包括:SQL注入和XSS跨站脚本攻击. 这篇文章我们主要讲SQL注入,SQL注入即是指web应用程序对 ...
- Tutorial: How to install GNU MCU Eclipse?
Overview For more flexibility and upgradeability, GNU MCU Eclipse is not packed as a all-inclusive s ...
- Python读取YAML配置数据
python编写的一些脚本需要一些简单配置时可以使用yaml文件进行设置.本文将介绍如何使用pyyaml进行读取配置数据. 首先安装pyyaml pip install pyyaml 简单使用下pyy ...
- Win10 内存内存占用过高的一种解决方案
前言 最近win10的电脑一开机,什么都没启动,内存占用率高达90%,笔记本虽然是8G的内存,但不应该如此不堪.在网上找到一个十分有效的解决方案. 正文 使用 win10系统自带内存诊断工具 按下 h ...
- VUE商城项目 - 项目优化上线 - 手稿
- Java List对象分组
实体类 必须重写equals和hashCode方法 package com.zcsoft.rc.backend.biz.vo.securityLibary; import java.util.Date ...
- yb 课堂实战之视频列表接口开发+API权限路径规划 《三》
开发JsonData工具类 package net.ybclass.online_ybclass.utils; public class JsonData { /** * 状态码,0表示成功过,1表示 ...
- Pypi配置API Token
技术背景 在许久之前写的一篇博客中,我们介绍过使用twine向pypi上传我们自己的开源包的方法.最近发现这个方法已经不再支持了(报错信息如下所示),现在最新版需要使用API Token进行文件上传, ...
- Windows下git配合Unity要设置autocrlf=false
Unity的.asset文件的换行符一定是Unix (LF)格式的,哪怕在设置里选了用Windows (CRLF)也没用,这个选项只对创建的C# Script有效. 这些Unix换行文件提交上去没问题 ...
- 精品 IDEA 插件大汇总!值得收藏
轻松提高 Java 开发效率 俗话说,工欲善其事,必先利其器.想要提升编程开发效率,必须选择一款顺手的开发工具. 对于 Java 开发者,JetBrains IDEA 无疑是目前最主流的开发工具,既简 ...