1、基本类型和引用类型的值:五种基本数据类型属于基本类型值,对象属于引用类型值,JS不允许对内存访问,因而操作对象时实际是操作对象的引用。
①动态的属性:可以给对象添加属性和方法,也可以删除和变更;
②复制变量值:复制引用类型的值实际是复制了在内存堆中该数据的指针;
③传递参数:传递给函数的参数的值如果是引用类型的值,则会将该值的地址传递给参数;
④检测类型:检测基本数据类型时使用typeof操作符,检测引用类型比如null/对象/数组/正则表达式时,使用instanceof操作符,使用方法: 变量 instanceof Object/Array/RegExp.
2、执行环境及其作用域:分为全局执行环境和局部执行环境,全局执行环境实际上被认为是windows对象,全局变量及其函数都被当做windows对象的属性和方法,每个函数都存在自己的执行环境,当执行流进入一个函数时,会将该函数的执行环境推入环境栈,函数执行结束后,再弹出环境栈。
①作用域链:每个函数执行时,都会创建一个作用域链,用于保证该执行环境能够有权访问到该执行环境下的所有变量和方法,如果在当前执行环境找不到,则会往函数外的执行环境找,直到window对象下的全局环境,如果没找到则报错。即里面可以访问外面,外面不能访问里面。
②延长作用域链:catch语句和with语句,对于with语句而言,会将语句中的对象插入到当前执行环境的前端中,从而包含该对象的所有属性和方法,在执行环境结束后被销毁,而catch语句则会捕获错误对象,从而抛出错误。
③没有块级作用域
3、垃圾收集:JS的垃圾收集机制原理:找到那些不再继续使用的变量,然后释放所占用的内存,通常使用两种标记方法来标记哪些变量不再使用,以便清除。
①标记清除:变量进入内存时会被标记为进入环境,函数执行结束时,变量被标记为离开环境,对于离开环境的变量将执行内存清除工作;
②引用计数(不常用):存在循环引用的问题;
③性能问题:确定垃圾回收的时间间隔时个问题;
④管理内存:手动解除占用,比如使用完一个全局对象和变量后,赋值为null,但这并不意味着自动回收了内存。