变量保存数据的容器;
数据分为基本类型(不修改,不能添加属性,它们的方法和属性都在Number,String等中,数据存储在栈)
所有的字符串方法都是返回一个新的字符串而不是修改本来的(不修改)。基本类型复制副本改变不影响原来的,基本类型传参就是传值
引用类型(可修改,地址存在栈中,数据存储在堆中),即使内容一样地址也就是堆中的位置不一样也不相等;引用类型复制副本改变影响原来的,因为两个指向同一个地址,要个完全独立的复制即副本不影响原始值。传参传的是值,函数内改变的内容函数外的会受到影响
相等的
栈内存,有序排列的,空间大小固定不能扩建
堆内存,无序排列,空间大小不固定,可以扩建
变量的生命周期,哪里可以访问到变量。
作用域:全局作用域,局部作用域(函数作用域)
延长作用域链:with,作用域链延长不利于查询速度。
JS解析机制:
1、预解析:分标签进行分别在作用域里预解析,遇到var 的变量名提出,等于undefined,遇到function整个函数声明 ,函数体提出;函数的argument和局部变量一样
2、逐行读代码
变量名冲突与预解析无关,读行到哪里是哪里;函数名和变量名冲突,函数留存;函数与函数名冲突,留后面的。
不在代码块里面定义函数;用var可以。
内存
1垃圾收集机制:释放无用的机制,回收内存;自动,手动;原理:找出无用的数据,打上标记(告诉你这个变量是无用的),释放内存,这个过程会周期性的进行。
标识无用的策略有两种:
1标记清除:垃圾收集器给内存中所有的变量一次性都打上标记,去掉环境中的变量(还没有离开执行环境的变量),以及被环境中的变量引用的变量他们上面的标记,对于局部变量来说如果它所在的函数执行完之后局部变量就离开了它的执行环境,因为这个环境已经执行完毕就会销毁了,销毁带标记的值并回收他们所占用的内存,现在一般浏览器都是采用标记清除机制只是垃圾收集间隔不同;
2引用计数:跟踪记录每个数据被引用的次数,当我们声明一个变量,并将一个引用类型的值赋值给这个变量,这个数据就被这个变量引用了一次,引用次数是1,如果这个是赋值给另外一个变量,那么引用次数是2;相反引用这个值的变量得到了另外的值那么引用次数就是0。当值的引用次数是0,那么就没有人引用这个值,可以被回收。引用计数会被循环引用问题很大。
内存管理:
Web浏览器<桌面应用程序解除引用设置为null(对于全局变量)