Simonzhangs' blog Simonzhangs' blog
首页
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • JS设计模式总结
  • 《Vue》
  • 《React》
  • 《TypeScript 从零实现 axios》
  • TypeScript
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • apple music
  • extension
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Simonzhangs

前端学习探索者
首页
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • JS设计模式总结
  • 《Vue》
  • 《React》
  • 《TypeScript 从零实现 axios》
  • TypeScript
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • apple music
  • extension
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • JS基础

    • typeof与instanceof
      • typeof
      • instanceof
    • JS变量声明的六种方式
    • this指向
    • ==和===运算符区别
    • Promise基础
    • JS异步发展
  • 基础
  • 内置对象
  • 面向对象
  • 异步操作
  • DOM
  • 事件
  • 浏览器模型
  • JS常见高级函数
  • 《JavaScript教程》笔记
  • JS基础
simonzhangs
2022-04-21
目录

typeof与instanceof

# typeof

typeof 是一个运算符,使用:typeof(表达式)、typeof 变量名,返回值是一个字符串,用来说明变量的数据类型。

可以用来判断number、string、object、boolean、function、undefined、symbol这七种类型。

提示

typeof方法有一定局限性:对于对象、数组、null返回的值都是object。

因为在JS地层存储变量的时候,会在变量的机器码的低位1-3位存储其类型信息:

  • 000:对象
  • 010:浮点数
  • 100:字符串
  • 110: 布尔值
  • 1:整数
  • 特例:
    • null的所有机器码均为0
    • undefined:用-2^30整数来表示

而typeof则是用机器码来判断类型,故null也会被判断为对象。

console.log(typeof('lili'))
console.log(typeof(1))
console.log(typeof(false))
console.log(typeof(undefined))
console.log(typeof(null))
console.log(typeof({}))
console.log(typeof([]))
console.log(typeof(()=>{}))
console.log(typeof(Symbol()))
1
2
3
4
5
6
7
8
9

# instanceof

instanceof 运算符用于检测构造函数的prototype属性是否出现在某个实例对象的__proto__上,返回值为布尔值,用于判断一个变量是否属于某个对象的实例。

原理: instaceof右边变量的prototype在左边变量的__proto__上即可。因此instanceof在查找过程中会遍历左边遍历的__proto__,直到找到右边变量的prototype,如果查找失败,则返回false。

可以通过Object.getPrototypeof()来获取变量的隐式原型。

const arr = [1, 2];
console.log(arr instanceof Object)

const proto1 = Object.getPrototypeOf(arr)
console.log(proto1);
const proto2 = Object.getPrototypeOf(proto1)
console.log(proto2);

console.log(Object.prototype)

console.log(proto1 === Object.prototype)
console.log(proto2 === Object.prototype)
1
2
3
4
5
6
7
8
9
10
11
12

instanceof 手动实现:

function myInstanceof(left, right) {
  let leftVal = Object.getPrototypeOf(left);
  const rightVal = right.prototype;

  while (leftVal !== null) {
    if (leftVal === rightVal) {
      return true;
    }
    leftVal = Object.getPrototypeOf(leftVal);
  }
  return false;
}
1
2
3
4
5
6
7
8
9
10
11
12
编辑 (opens new window)
上次更新: 2022/04/26, 21:54:00
JS变量声明的六种方式

JS变量声明的六种方式→

最近更新
01
一些有意思的类比
06-16
02
the-super-tiny-compiler解析
06-06
03
计算机编译原理总概
06-06
更多文章>
Theme by Vdoing | Copyright © 2021-2022
蜀ICP备2021023197号-2
Simonzhans | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
  • 飙升榜
  • 新歌榜
  • 云音乐民谣榜
  • 美国Billboard榜
  • UK排行榜周榜