【typeof instanceof Object.prototype.toString constructor区别】

几个数据类型判断区别

typeof

它返回的是一个字符串,表示未经过计算的操作数的类型

复制代码
typeof(undefined)
//"undefined"

typeof(null)
//"object"

typeof(100)
//"number"

typeof(NaN)
//"number"

typeof(true)
//"boolean"

typeof("foo")
//"string"

typeof function(){}
//function

typeof([1,2])
//"object"

typeof new object()
//object

typeof操作符适合对基本数据类型以及function的检测进行使用,当然null除外,而对于引用数据类型,就比如说Array 和 Object等它是不适用的。

instanceof

用于检测一个对象在其原型链中中是否存在一个构造函数的prototype属性

左操作数为对象,不是就返回 false,右操作数必须是 函数对象 或者 函数构造器,不是就返回 TypeError 异常

复制代码
obj instanceof constr;
function Person(){}
function Student(){}
Student.prototype=new Person();
Student.prototype.constructor=Student;

const ben=new Student();
ben instanceof Student;
//true

const one=new Person()
one instanceof Person;
//true
one instanceof Student;
//false
ben instanceof Person;
//true

任何一个构造函数都有一个prototype对象属性,这个对象属性将用作new实例化对象的原型对象。

instance适合用于判断对象是否属于Array Date RegExp内置对象

不同的window 或者 iframe之间的对象类型检测无法使用instanceof检测

Object.prototype.toString

它可以通过toString()来进行获取每个对象的类型

为了每一个对象都能通过Object.prototype.toString来进行检测,需要以Function.prototype.call或者Function.prototype.apply的形式来进行调用,传递要检查的对象作为第一个参数。

复制代码
Obejct.prototype.toString.call(undefined);
//  "[object Undefined]"


Obejct.prototype.toString.call(null);
//  "[object Null]"


Obejct.prototype.toString.call(true);
//  "[object Boolean]"


Obejct.prototype.toString.call('');
/// "[object String]"


Obejct.prototype.toString.call(123);
//  "[object Number]"


Obejct.prototype.toString.call([]);
//  "[object Array]"


Obejct.prototype.toString.call({});
//  "[object Object]"

使用object.prototype.toString方法能精准的判断出值的数据类型

但是需要注意的是:

方法重写:object.prototype.toString属于Object的原型方法,而Array或Function等类型作为Object的实例,都重写了toString方法,因此,不同的对象类型调用toString方法的时候,调用的是重写之后的toString方法,而非object上的原型toString方法,所以采用xxx.toString()不能得到其对象类型,之恩呢关键xxx转换成字符串类型。

constructor

任何对象都有constructor属性,继承自原型对象,constructor会指向构造函数这个对象的构造器或者构造函数

复制代码
Student.prototype.constructor === Student;
//  true

数组进行检测的时候就有:Array.isArray()正式引入JavaScript,该方法能准确的检测一个变量是否为数组类型

复制代码
Array.isArray(variable)
相关推荐
R1nG863几秒前
多线程安全设计 CANN Runtime关键数据结构的锁优化
开发语言·cann
初次见面我叫泰隆1 分钟前
Qt——5、Qt系统相关
开发语言·qt·客户端开发
亓才孓6 分钟前
[Class的应用]获取类的信息
java·开发语言
开开心心就好14 分钟前
AI人声伴奏分离工具,离线提取伴奏K歌用
java·linux·开发语言·网络·人工智能·电脑·blender
Never_Satisfied18 分钟前
在JavaScript / HTML中,关于querySelectorAll方法
开发语言·javascript·html
董世昌4118 分钟前
深度解析ES6 Set与Map:相同点、核心差异及实战选型
前端·javascript·es6
3GPP仿真实验室42 分钟前
【Matlab源码】6G候选波形:OFDM-IM 增强仿真平台 DM、CI
开发语言·matlab·ci/cd
devmoon1 小时前
在 Polkadot 上部署独立区块链Paseo 测试网实战部署指南
开发语言·安全·区块链·polkadot·erc-20·测试网·独立链
lili-felicity1 小时前
CANN流水线并行推理与资源调度优化
开发语言·人工智能
沐知全栈开发1 小时前
CSS3 边框:全面解析与实战技巧
开发语言