我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章
js数据类型
js中数据类型 一共有八种。分别是
- 7种原始类型: string, number, null, undefined, boolean, symbol,BigInt
- BigInt: 比number数据类型支持的范围更大的整数值。使用BigInt,整数溢出,精度丢失将不再是问题
- 引用数据类型Object,又分
- 对象数据类型: 普通对象 {} , 数组对象 [], 正则对象 /^$/ , 日期对象 new Date() , 数学函数对象 Math ...
- 函数数据类型: 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
- 浏览器空闲时候,自主进行内存回收,把所有不被占用的堆内存销毁掉