问题记录
Number.toFixed(n)
数字保留n位小数,
这里需要注意toFixed之后,如果后面保留的小数位最后是0的话,Number类型会变成String
js的数据结构
在js中数据类型一般分类基本数据类型(Number Boolean Null Undefined String Symbol)与引用数据类型(Object Array Function ...),其中栈一般用于存放基本类型数据或者引用类型数据的指针,堆用于存放引用类型数据
栈
堆
堆数据结构是一种无序的树状结构,同时它还满足key-value键值对的存储方式;我们只用知道key名,就能通过key查找到对应的value
区别例子:
基本类型:
var a = 1; var b = a; a = 2;
//b依旧是1
引用类型:
var a = [1,2,3]; var b = a; a.push(4);
//b与a共用一个数组,a.push(4)后b打印出[1,2,3,4]
队列
队列具有FIFO(First In First Out)先进先出的特性,与栈内存不同的是,栈内存只存在一个出口用于数据进栈出栈;而队列有一个入口与一个出口,在js中使用队列较为突出的就是js执行机制中的event loop事件循环
深入理解eventloop :https://www.cnblogs.com/echolun/p/10765562.html
一般用栈来执行同步事件,如果是异步事件则用队列,会判断读取任务队列中的事件然后加入执行栈中(转同步)
js的垃圾回收机制
函数内的局部变量会在执行完函数后,回收不被需要的变量
全局变量则很难判断
垃圾回收的两种模式
引用计数
给变量的引用进行计数,如果计数为0,则表示不需要可以回收
标记清除=> 标记然后清除没标记的
标记清除的概念也好理解,从根部出发看是否能达到某个对象,如果能达到则认定这个对象还被需要,如果无法达到,则释放它,这个过程大致分为三步:
a.垃圾回收器创建roots列表,roots通常是代码中保留引用的全局变量,在js中,我们一般认定全局对象window作为root,也就是所谓的根部。
b.从根部出发检查所有 的roots,所有的children也会被递归检查,能从root到达的都会被标记为active。
c.未被标记为active的数据被认定为不再需要,垃圾回收器开始释放它们。
(window.a window.b window是root a,b是roots列表中的变量)