数据类型检测的方法有哪些???

数据类型检测的方法有哪些???

1. typeof

js 复制代码
console.log(typeof 2);               // number
console.log(typeof true);            // boolean
console.log(typeof 'str');           // string
console.log(typeof []);              // object    
console.log(typeof function(){});    // function
console.log(typeof {});              // object
console.log(typeof undefined);       // undefined
console.log(typeof null);            // object

其中数据、对象、null都会被判断为 object ,其他都正确

我们知道object是一种广泛类型,它涵盖了普通的对象、数组、函数,那为什么function没有被判断为object,而null却判断为object了呢??

  • 虽然函数确实是对象的一种类型,但在JavaScript中,函数被视为一种特殊的对象,因为它们具有可调用的行为。因此,typeof操作符将函数识别为函数类型,而不是对象类型。在JavaScript中,函数被视为一等公民,具有一些独特的特性,例如:

(1) 可调用性 :函数可以通过()运算符进行调用,执行其中的代码。

(2) 具有属性和方法:函数是对象的一种特殊形式,可以拥有属性和方法。

  • 在JavaScript中,将null判断为object是一个历史遗留问题,属于语言本身的设计缺陷。这个问题源于JavaScript的早期版本中的一个错误。在JavaScript的初始实现中,使用32位系统表示值的前三位用于标识该值的类型。其中,对象的标识位为000,而null被错误地赋予了000,因此被错误地判断为对象。

尽管这个问题已经存在了很长时间,但为了保持向后兼容性,JavaScript的设计者们选择不修复这个问题。因此,即使在现代的JavaScript引擎中,typeof null仍然返回"object"

2.instanceof

instanceof可以正确地判断对象的类型,其内部运行机制是判断在其原型链中能否找到该类型的原型

js 复制代码
console.log(2 instanceof Number);                    // false
console.log(true instanceof Boolean);                // false 
console.log('str' instanceof String);                // false 
 
console.log([] instanceof Array);                    // true
console.log(function(){} instanceof Function);       // true
console.log({} instanceof Object);                   // true

可以看到,instanceof只能判断引用数据类型,而不能判断基本数据类型。instanceof运算符还能用来测试一个对象在其原型链中是否存在一个构造函数的prototype属性

3.constructor

constructor有两个作用,一是判断数据类型,二是对象实例通过constructor对象访问它的构造函数。需要注意,如果创建一个对象来改变它的原型,constructor就不能用来判断数据类型了:

js 复制代码
function Fn(){};
 
Fn.prototype = new Array();
 
var f = new Fn();
 
console.log(f.constructor===Fn);    // false
console.log(f.constructor===Array); // true

4.Object.prototype.toString.call()

Object.prototype.toString.call() 使用 Object 对象的原型方法 toString 来判断数据类型:

js 复制代码
var a = Object.prototype.toString;
 
console.log(a.call(2));
console.log(a.call(true));
console.log(a.call('str'));
console.log(a.call([]));
console.log(a.call(function(){}));
console.log(a.call({}));
console.log(a.call(undefined));
console.log(a.call(null));

同样是检测对象obj调用toString方法,obj.toString()的结果和Object.prototype.toString.call(obj)的结果不一样,这是为什么?

这是因为toString是Object的原型方法,而Array、function等类型作为Object的实例,都重写了toString方法。不同的对象类型调用toString方法时,根据原型链的知识,调用的是对应的重写之后的toString方法(function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串...),而不会去调用Object上原型toString方法(返回对象的具体类型),所以采用obj.toString()不能得到其对象类型,只能将obj转换为字符串类型;因此,在想要得到对象的具体类型时,应该调用Object原型上的toString方法。

相关推荐
骑驴看星星a19 分钟前
Vue中的scoped属性
前端·javascript·vue.js
四月_h26 分钟前
在 Vue 3 + TypeScript 项目中实现主题切换功能
前端·vue.js·typescript
qq_4275060832 分钟前
vue3写一个简单的时间轴组件
前端·javascript·vue.js
雨枪幻。2 小时前
spring boot开发:一些基础知识
开发语言·前端·javascript
lecepin2 小时前
AI Coding 资讯 2025.8.27
前端·ai编程
TimelessHaze3 小时前
拆解字节面试题:async/await 到底是什么?底层实现 + 最佳实践全解析
前端·javascript·trae
执键行天涯3 小时前
从双重检查锁定的设计意图、锁的作用、第一次检查提升性能的原理三个角度,详细拆解单例模式的逻辑
java·前端·github
青青子衿越3 小时前
微信小程序web-view嵌套H5,小程序与H5通信
前端·微信小程序·小程序
OpenTiny社区3 小时前
TinyEngine 2.8版本正式发布:AI能力、区块管理、Docker部署一键强化,迈向智能时代!
前端·vue.js·低代码
qfZYG4 小时前
Trae 编辑器在 Python 环境缺少 Pylance,怎么解决
前端·vue.js·编辑器