typeof 与 instanceof 区别

解析 typeof instanceof 阅读详情

typeof 与 instanceof 区别

#一、typeof

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

使用方法如下:

typeof operand
typeof(operand) 

operand表示对象或原始值的表达式,其类型将被返回

举个例子

typeof 1 // 'number'
typeof '1' // 'string'
typeof undefined // 'undefined'
typeof true // 'boolean'
typeof Symbol() // 'symbol'
typeof null // 'object'
typeof [] // 'object'
typeof {} // 'object'
typeof console // 'object'
typeof console.log // 'function' 

从上面例子,前6个都是基础数据类型。虽然typeof nullobject,但这只是JavaScript 存在的一个悠久 Bug,不代表null就是引用数据类型,并且null本身也不是对象

所以,nulltypeof之后返回的是有问题的结果,不能作为判断null的方法。如果你需要在 if 语句中判断是否为 null,直接通过===null来判断就好

同时,可以发现引用类型数据,用typeof来判断的话,除了function会被识别出来之外,其余的都输出object

如果我们想要判断一个变量是否存在,可以使用typeof:(不能使用if(a), 若a未声明,则报错)

if(typeof a != 'undefined'){
    //变量存在
} 

#二、instanceof

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上

使用如下:

object instanceof constructor 

object为实例对象,constructor为构造函数

构造函数通过new可以实例对象,instanceof能判断这个对象是否是之前那个构造函数生成的对象

// 定义构建函数
let Car = function() {}
let benz = new Car()
benz instanceof Car // true
let car = new String('xxx')
car instanceof String // true
let str = 'xxx'
str instanceof String // false 

关于instanceof的实现原理,可以参考下面:

function myInstanceof(left, right) {
    // 这里先用typeof来判断基础数据类型,如果是,直接返回false
    if(typeof left !== 'object' || left === null) return false;
    // getProtypeOf是Object对象自带的API,能够拿到参数的原型对象
    let proto = Object.getPrototypeOf(left);
    while(true) {                  
        if(proto === null) return false;
        if(proto === right.prototype) return true;//找到相同原型对象,返回true
        proto = Object.getPrototypeof(proto);
    }
} 

也就是顺着原型链去找,直到找到相同的原型对象,返回true,否则为false

#三、区别

typeofinstanceof都是判断数据类型的方法,区别如下:

  • typeof会返回一个变量的基本类型,instanceof返回的是一个布尔值
  • instanceof 可以准确地判断复杂引用数据类型,但是不能正确判断基础数据类型
  • typeof 也存在弊端,它虽然可以判断基础数据类型(null 除外),但是引用数据类型中,除了function 类型以外,其他的也无法判断

可以看到,上述两种方法都有弊端,并不能满足所有场景的需求

如果需要通用检测数据类型,可以采用Object.prototype.toString,调用该方法,统一返回格式“[object Xxx]”的字符串

如下

Object.prototype.toString({})       // "[object Object]"
Object.prototype.toString.call({})  // 同上结果,加上call也ok
Object.prototype.toString.call(1)    // "[object Number]"
Object.prototype.toString.call('1')  // "[object String]"
Object.prototype.toString.call(true)  // "[object Boolean]"
Object.prototype.toString.call(function(){})  // "[object Function]"
Object.prototype.toString.call(null)   //"[object Null]"
Object.prototype.toString.call(undefined) //"[object Undefined]"
Object.prototype.toString.call(/123/g)    //"[object RegExp]"
Object.prototype.toString.call(new Date()) //"[object Date]"
Object.prototype.toString.call([])       //"[object Array]"
Object.prototype.toString.call(document)  //"[object HTMLDocument]"
Object.prototype.toString.call(window)   //"[object Window]" 

了解了toString的基本用法,下面就实现一个全局通用的数据类型判断方法

function getType(obj){
  let type  = typeof obj;
  if (type !== "object") {    // 先进行typeof判断,如果是基础数据类型,直接返回
    return type;
  }
  // 对于typeof返回结果是object的,再进行如下的判断,正则返回结果
  return Object.prototype.toString.call(obj).replace(/^[object (\S+)]$/, '$1'); 
} 

使用如下

getType([])     // "Array" typeof []是object,因此toString返回
getType('123')  // "string" typeof 直接返回
getType(window) // "Window" toString返回
getType(null)   // "Null"首字母大写,typeof null是object,需toString来判断
getType(undefined)   // "undefined" typeof 直接返回
getType()            // "undefined" typeof 直接返回
getType(function(){}) // "function" typeof能判断,因此首字母小写
getType(/123/g)      //"RegExp" toString返回 
ROS TF坐标转换实战:从零搭建机器人坐标系(附常见问题排查) 本文提供了一份ROS TF坐标转换的实战指南,详细讲解了如何从零为机器人搭建完整的坐标系,并深入解析了TF的原理。内容涵盖静态动态坐标变换的发布、URDF模型使用、以及Rvizrqt_tf_tree等可视化调试工具。文章还附带了常见问题排查表,帮助开发者快速定位并解决TF树断裂、数据错位等典型问题。 阅读详情

相关推荐

验证码破解2.0:Python+CV大模型搞定滑块/点选验证

核心创新:基于YOLOv8+SAM CV大模型的端到端验证码破解方案,无需人工设计特征,适配多种验证码类型;核心价值高成功率:滑块验证≥95%,点选验证≥90%,远超传统CV方案;低延迟:单验证码破解≤2秒,满足高并发采集需求;行为模拟:生成符合人类操作的轨迹,绕过行为检测;易扩展:统一架构支持新增验证码类型,仅需少量标注数据微调;技术要点采用YOLOv8实现快速目标检测,SAM实现像素级分割;生成物理规律的人类轨迹,模拟真实操作行为;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1234

typeofinstanceof区别是什么?

typeofinstance of 的区别

qq_51441159的博客 7501

3Dmagic立体光栅软件立体画设计制作

破解版一款非常优秀的立体制作软件,国产,没有任何插件,

typeofinstanceof区别

相同点:1.两者都是数据类型检测的方法区别:1. 返回的值不同   typeof返回的结果是字符串,返回值有number、string、boolean、function、undefined、object六个;   instance of返回的是布尔值,true或false;2. 判断的类型不同   typeof可以判断所有变量的类型。而对于丰富的对象实例,只能返回object,不能得到真实的数据类型。   instance of只能用来判断对象。可以对不同的实例对象进行判断,判断方法是根据对象的原型链一次向

fangqi20170515的博客 2781

JS数据类型判断,typeofinstanceof区别

typeofinstanceof区别 typeof 用于数据类型的判断,返回值有number、string、boolean、function、undefined、object 六个。 <script> var a, b, c, d, e, f,g,h,i; a = [1, 2, 3, 4, 5]; b = 1; c = "weaface"; d = false; f = null;

qq_53884837的博客 4138

typeof instanceof区别

typeof 一般是用来判断变量是否存在,返回他的类型,其中基本数据类型 null 返回的是一个 object,但 null 不属于引用数据类型,typeof 除了判断 function 函数会识别,其他的引用类型输出为 objectinstanceof 一般是用来判断引用数据类型,但不能正确判断基本数据类型,根据在原型链中查找判断当前数据的原型对象是否存在返回布尔类型。

2301_76869008的博客 1644

面试官:说说 typeof instanceof 区别?

一、typeoftypeof 操作符返回一个字符串,表示未经计算的操作数的类型使用方法如下:typeofoperand typeof(operand) operand表示对象或原始值的表...

weixin_44475093的博客 1万+

js instanceof typeof区别,实现 instanceof

instanceof 可以正确的判断对象的类型,因为内部机制是通过判断对象的原型链中是不是能找到类型的 prototype typeof 是判断参数是什么类型的实例,返回值为说明运算数类型的字符串。 返回值结果:“number”、“string”、“boolean”、“object”、“function”、“undefined”

guoqing的博客 1016

typeofinstanceof区别及用法

js中typeofinstanceof区别 在我们运用JavaScripttypeofinstanceof是我们经常用到来判断一个变量的类型,以及是否为空,但是他们两者之间还是有较大的区别的,首先来说typeof typeof typeof的返回值是个字符串,返回的字符串表达了程序员想要输出的变量类型 然而typeof返回的结果通常情况下一般都是以下6个: number string bo...

刘毅鹏的博客 5070

typeofinstanceof区别

1:操作数数量不同 typeof的操作数是 1个 instanceof的操作数是 2个 # 1个操作数 console.log(typeof('strings')); # 2个操作数 var c = new String('Hellos'); console.log(c instanceof String); 2:返回值不同 typeof返回的是字符串 数据类型 instanceof返回的是布尔值 3:操作数类型不同 typeof操作的可以是简单数据类型,函数,或者对象 instanceof操作的 左边

Always-Learning 567

typeofinstanceof区别

虽然typeof null为object,但这只是JavaScript存在的一个悠久Bug,不代表null就是引用数据类型,并且本身也不是对象。所以,null在typeof之后返回的是有问题的结果,不能作为判断null的方法。如果需要通用检测数据类型,可以采用Object.prototype.toString,调用该方法,统一返回格式"[object Xxx]"的字符串。同时,可以发现引用类型数据,用typeof来判断的话,除了function会被识别出来之外,其余的都输出object。

2301_80060263的博客 401

typeof instanceof 有什么区别

所以,null 在 typeof 之后返回的是有问题的结果,不能作为判断null的方法。而 typeof 也存在弊端,它虽然可以判断基础数据类型(null 除外),但是引用数据类型中,除了 function 类型以外,其他的也无法判断。同时,可以发现引用类型数据,用typeof来判断的话,除了function会被识别出来之外,其余的都输出object。如果我们想要判断一个变量是否存在,可以使用typeof:(不能使用if(a), 若a未声明,则报错)operand表示对象或原始值的表达式,其类型将被返回。

weixin_67762121的博客 190

typeofinstanceof区别

typeofinstanceof区别 一、typeof typeof是一个一元运算,放在一个运算数之前,运算数可以是任意类型。 它返回值是一个字符串,该字符串说明运算数的类型。(typeof 运算符返回一个用来表示表达式的数据类型的字符串。 ) typeof的返回值类型有七种 number, boolean, string, undefined, object, function,symbol...

qq_43287488的博客 384

instanceoftypeof区别

instanceoftypeofJavaScript中用于检测变量类型的运算符,但两者的用途机制存在本质差异。操作符用途适用类型返回值典型用途typeof判断基本数据类型原始类型、函数字符串判断 number、string 等instanceof判断对象的原型链关系对象布尔值判断对象属于哪个类。

2402_88963084的博客 694

typeofinstanceof区别用法

一、typeof typeof 操作符返回一个字符串,表示未经计算的操作数的类型。 console.log(typeof 3.14); //number console.log(typeof Math.LN2); //number console.log(typeof Infinity); //number console.log(typeof NaN); // number NaN是"Not-...

qq_43437571的博客 463

instanceoftypeof区别

虽然typeofinstanceof都可以用来判断变量,它们的用法有很大区别typeof会返回一个变量的基本类型,instanceof返回的是一个布尔值 instanceof运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上。 typeof判断 ...

qq_24343389的博客 991

JS中的typeofinstanceof区别

JS中的typeofinstanceof区别 01:typeof常用来判断一个变量【可以是基本数据类型的变量/对象数据类型的变量】 是什么类型。 instanceof 仅仅 用来判断一个 对象 是否是 指定的 对象数据类型 的一个 实例。 区别: 1:typeof操作符 作用域 五种基本数据类型的变量 一种复杂数据类型的变量 , 返回值 是: string number boolean undefined null object function 2:当typeof操作符 无论是 作

qq_19373729的博客 605

typeofinstanceof,isPrototypeOf区别

首先大家应该要简单了解typeof是什么?typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型。它返回值是一个字符串,该字符串说明运算数的类型。typeof 可以用来检测给定变量的数据类型。instanceof是什么?nstanceof运算符用来判断一个构造函数的prototype属性所指向的对象是否存在另外一个要检测对象的原型链上。通常来讲,使用 instanceof 就是判断...

weixin_34128501的博客 791

typeof instanceof区别

如上是我最近刷题遇到的一个小坑,可以看到用typeof判断null的类型时,返回的是一个’object’,而用instanceof判断时返回的是false,但不知道具体原因。于是重新再学习该部分内容并归纳总结。 typeof typeof 的数据类型 typeof 运算符不是变量。它属于运算符。运算符(比如 + - * /)没有数据类型。 但是,typeof 始终会返回字符串(包含运算数的类型)。 typeof 操作符返回一个字符串,表示未经计算的操作数的类型。 我们可以利用 typeof 来判断numb.

m0_67263080的博客 320
上一篇: Taro跨端开发探索16——商品详情页面开发
下一篇: typescript 类型体操 之 43-easy-exclude
梅花十三儿
博客等级 码龄5年 1035粉丝 444原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值