[经典面试题]JS的typeof和instanceof区别

一、typeof

typeof 是一个一元操作符不是函数,所以不需要传递参数,使用方法非常简单:typeof A

对于基本类型

let s = "Nicholas";

let b = true;

let i = 22;

let u;

let sb = undefined;

console.log(typeof s); // string

console.log(typeof b); // boolean

console.log(typeof i); // number

console.log(typeof u); // undefined

console.log(typeof sb); // undefined

对于引用类型

let o = {}; let a = \[\];

console.log(typeof o); // object

console.log(typeof a); // object

对于NULL类型

let n = null;

console.log(typeof n); // object

虽然typeof null为object,但这只是JavaScript 存在的一个悠久 Bug,不代表null就是引用数据类型,并且null本身也不是对象

对于函数类型

let nn = function() {}

console.log(typeof nn); // function

对于日期类型

let date0 = new Date()

console.log(typeof date0); // object

对于正则类型

let r = /a-z/;

console.log(typeof r ); // object

对于包装类型

let sss = new String('sss')

let nnn = new Number(123)

let bbb = new Boolean(true)

let fff = new Function ()

console.log(typeof sss) // object

console.log(typeof nnn) // object

console.log(typeof bbb) // object

console.log(typeof fff) // function

使用new操作符,除Function外的所有构造函数的类型都是object。

二、instanceof

instance中文翻译为实例,instanceof就是判断该对象是谁的实例。与typeof不同,它返回布尔值。

instanceof是对象运算符

instanceof的判断就是根据原型链进行搜寻,在对象obj1的原型链上如果存在另一个对象obj2的原型属性,那么表达式(obj1 instanceof obj2)返回值为true;否则返回false。

所以:

let sss = 'sss'

let nnn = 123

let bbb = true

console.log(sss instanceof String) // false

console.log(nnn instanceof Number) // false

console.log(bbb instanceof Boolean) // false

因为sss nnn bbb是原始值,而不是通过包装函数生成的实例。

let sss = new String('sss')

let nnn = new Number(123)

let bbb = new Boolean(true)

console.log(sss instanceof String) // true

console.log(nnn instanceof Number) // true

console.log(bbb instanceof Boolean) // true

正则和函数也一样

let rrr = new RegExp(/a-z/)

var fff = new Function()

console.log(rrr instanceof RegExp) // true

console.log(fff instanceof Function) // true

如果是作用在自己定义的构造函数呢?

let Cat = function() {}

let benz = new Cat()

benz instanceof Cat // true

benz是实例不是构造函数所以:

benz instanceof Object // true

benz instanceof Function //false

再来个构造函数:

let BigCat = function() {}

BigCat.prototype = new Cat();
let bigBenz = new BigCat()

bigBenz instanceof Car // true

再来个奇葩的

let obj = Object.create(benz); //Car {}

obj instanceof Object //true

let obj = Object.create(null);

obj instanceof Object // false

instanceof检测null和undefined :

null instanceof Object // false

undefined instanceof Object // false

三、总结 区别

  1. typeof会返回一个变量的基本类型,instanceof返回的是一个布尔值
  2. typeof是一元运算符 instanceof是对象运算符
  3. typeof 更合适判断基本类型,对引用类型、构造函数的实例对象以及null无法判断出准确类型
    instanceof 用于判断实例对象是否是某一构造函数的实例化对象,从而判处该对象所属的类型。 这种方式是通过原型链查找。
相关推荐
不会C语言的男孩4 分钟前
C++ Primer 第2章:变量和基本类型
开发语言·c++
wuxia21186 分钟前
微信小程序单击元素切换元素的显示和隐藏
javascript·微信小程序·setdata
JustHappy13 分钟前
古法编程秘籍(二):什么是代码模块化?别背概念,把房间收拾明白就够了
前端·后端
小江的记录本20 分钟前
【JVM虚拟机】堆内存分代模型:年轻代(Eden+Survivor)、老年代、元空间Metaspace(附《思维导图》+《面试高频考点清单》)
java·前端·jvm·后端·python·spring·面试
在繁华处23 分钟前
Java从零到熟练(三):流程控制
java·开发语言·python
weixin_4713830343 分钟前
图片预解码缓存
前端·浏览器缓存·图片预解码
一起学开源1 小时前
一文读懂 ReAct 范式:让 AI Agent 真正学会“思考+行动“
java·javascript·react.js·ecmascript·react·alibaba·智能体开发
云泽8081 小时前
C++ 可调用对象通关指南:深度解析 Lambda 表达式、function 包装器与 bind 绑定器
开发语言·c++·算法
郑洁文2 小时前
基于网络爬虫的Web敏感信息泄露自动化检测工具
前端·爬虫·网络安全·自动化
游九尘2 小时前
JavaScript 实现三段式版本号对比函数(app升级用)
javascript·uni-app