js数据类型和栈,堆内存

182 阅读3分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章

js数据类型

js中数据类型 一共有八种。分别是

  • 7种原始类型: string, number, null, undefined, boolean, symbol,BigInt
  1. BigInt: 比number数据类型支持的范围更大的整数值。使用BigInt,整数溢出,精度丢失将不再是问题
  • 引用数据类型Object,又分
  1. 对象数据类型: 普通对象 {} , 数组对象 [], 正则对象 /^$/ , 日期对象 new Date() , 数学函数对象 Math ...
  2. 函数数据类型: function

检测数据类型的一些方法

  • 基本类型都可以用typeof来判断,function 也可以通过typeof来判断,

注意:所有值都是存储在内存中,且以二进制方式存储,返回结果都是字符串,

    typeof NaN // "number"
    typeof null // "object"
    typeof a // "undefined"
    // 浏览器用typeof检测一个未定义的变量为undefined
  • instanceof 是用来判断一个对象是不是另一个对象的原型链中 所以我们可以用来判断引用类型的类型
    [] instanceof Object // true
  • constructor 是用来检测构造函数
    function Fn () {}
    const fnn = new Fn()
    console.log(fnn.constructor.name) // Fn
    
  • Object.prototype.toString.call 检测数据类型的
    Object.prototype.toString.call(12) // "[object Number]"
    Object.prototype.toString.call(true) // "[object Boolean]"

js的栈,堆内存

  • 栈内存(ECStack):提供JS代码的执行环境 和 存储基本数据类型值和变量和引用数据类型的地址
  • 堆内存(地址都是十六进制的):存储引用数据类型值(地址存在栈内存)(对象:键值对,函数:代码字符串)

栈内存(ECStack)

EC执行上下文,提供代码执行的环境

  • 全局的执行上下文 EC(G)=> 全局作用域
  • 函数中的代码都会在一个单独私有的执行上下文中处理 => 私有作用域(函数作用域)
  • 块级的执行上下文 => 块级作用域

VO变量对象:

  • 用来存放创建的变量和值的地方和引用数据类型的地址
  • 每一个执行上下文都有一个自己的变量对象,函数的私有上下文又叫AO变量对象

js中的作用域

作用域:全局作用域(EC(G) 函数作用域(私有作用域)块级作用域{}

栈内存的销毁:

  • 全局栈内存(EC(G))在页面关闭时销毁
  • 一般函数形成的私有作用域栈内存执行完毕即销毁
  • 但是当其他作用域中占用了该私有作用域东西

:该私有作用域里面还有一个函数在此开辟了一个堆内存,且被其他作用域里的变量所占用,就不能被销毁

想要销毁,只需将指向的指针改空指针就行 => const obj = { name: 'zs' } => obj = null

堆内存

全局对象(GO):

  • 浏览器会提供一些内置的属性方法在一个单独的内存中
  • 浏览器会让window指向GO

堆内存的销毁(谷歌浏览器):

  • 没有被任何变量或者其他东西所占用(也可以理解为没有人知道该堆内存的地址)
  • 只需把栈内存中的引用数据类型值改为空(形成空对象指针) => array = null
  • 浏览器空闲时候,自主进行内存回收,把所有不被占用的堆内存销毁掉