?当浏览器一打开的时候会开辟两个内存,一个堆内存,一个栈内存,栈内存存的是基本类型,(null,undefiend,number,string,Symbol//唯一值,bigint//安全有效数值,Boolean) bigint //es7中 出现的 那么就会有人问 什么是安全有效数字呢 因为 当数字足够大的时候,就会出现计算错误 那么安全数字是多少呢 Math.pow(2,53)-1//9007199254740991 在扩展一项 或者是 用Number 怎么获取最大安全数或最小安全数?Number.MAX_SAFE_INTEGER(最大)//9007199254740991 最小呢?Number.MIN_SAFE_INTEGER//(-9007199254740991) 害,张三:‘我就不信你说的,我来试试’
?我:‘张三,看是不是计算的出错了,还不信我?我能骗你不成?’ ? 张三:‘那怎么解决呢?’ 我:‘这里就要用到BigInt了’ BigInt(val)//val可以是 数字也可以是纯数字的字符串 结果:BigInt('10')//10n 9007199254740991n+12n
返回的是bigint类型 那就问了那怎么转成正常的类型呢 Number(9007199254741003n)//指定不行,返回的还是错误 那怎么处理呢 9007199254741003n.toString()//'9007199254741003' 解决完事 张三:‘牛啊,哥哥’
堆内存存的是引用类型?
GO(gaGlobal Object)//全局对象
变量对象?VO(Variable Object): 存放当前执行上下文中创建的变量和值
全局执行上下文(?EC(G)?):页面加载后进栈、销毁后出栈
解释 一下 var,const,var 申明变量的过程,比如 var a=2 ?var b=a b=3 console.log(a)//3 ? 先是创建值 然后指向 再说个题外话 var 申明的变量 都是存在 GO//全局中 var a=2 是 先是出现一个2 ---> a---->2(a指向2)然后又申明一个变量b 指向a? 就好比b--->a--->2 b=3,因为是基本类型所以修改的就是a---->3 这里我我解释一个函数,给大家解释 ?
var x = [12, 23]
function fn(y) {
y[0] = 100;
y = [100]
y[1] = [200] console.log(y)//[100,[200]]
}
fn(x)
console.log(x)//[100,23] 那么为什么呢,我来解释一下 全局有一个x是存在 GO里面的,因为是引用类型,所以存的是地址,假如[12,23]指向的地址是0x001 在这个函数里面,fn(x)执行x实参传递给形参y y[0]指向的就是0x001修改了全局x的值//[100,23] 第二步 y=[100],这里就好比一个y又重新指向了[100]//假如地址是0x002 y[1]=[200]//先去找y是不是存在 y存在 y[1]=[200]//[200]假如地址是0x003及函数体内 console.log(y)//--->[0x002,0x003]--->[100,[200]]
题外? 再说一个GO里面存放了很多api,比如alert,setInterval,setTimeout.... 那么为什么我们在执行中可以用到这些api呢,该怎么解释呢,因为在全局执行上下文中,会默认创建一个window---->GO//指向的是地址,那么在解释一下 为什么 console.log(x)//一个没有申明的变量,会报错,控制台出现x is not defined 如果是console.log(window.x)//undefiend 这是为什么呢,因为值执行上下文中 直接打印未申明的x,先是在执行上下文中找及EC,EC未找到,则去GO里面找,如果没找到,则报错,如果是console.log(window.x)这样的话,全局EC(执行上下文的window指向的GO的地址)因为是一个Object所以不会报错//返回undefiend
?
|