1、变量包含俩种不同类型的值:基本类型值和引用类型值。基本类型值是指简单的数据段,而引用类型是指那些可能由多个值构成的对象
2、引用类型的值是保存在内存中的对象,而JS不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间,在操作对象时实际上是在操作对象的引用而不是实际的对象。
3、对于引用类型的值,我们可以为其添加属性和方法,也可以删除属性和方法。但是我们不能给基本类型的值添加属性
4、从一个变量向另一个变量复制基本类型的值,会在对象变量上创建一个新值,然后把改值复制到新分配的位置上。这两个变量是独立的,两个变量可以参与任何操作而不互相影响。
5、从一个变量向另一个变量赋值引用类型的值时,也会将存储在变量对象中的值赋值一份放到新变量分配的空间中,但是这个值得副本实际上是一个指针,而这个指针指向存储在堆中的一个对象,因此复制结束后实际上,两个变量将引用同一个对象,从而改变一个变量就会影响另一个变量。。
6、传递参数:基本类型的值传递如同基本类型的变量赋值一样,引用类型的值传递如同引用类型的变量赋值一样。访问变量有按值和按引用两种方式,而参数只能按值传递。
7、typeof操作符是确定一个变量是字符串、数值、布尔值,还是undefined的最佳工具。但是在检测引用类型的值时,使用instanceof操作符。所有的引用类型都是Object的实例,因此在检测引用类型和Object构造函数时,instanceof操作符始终会返回true。
8、执行环境及作用域:全局的执行环境被认为是window对象,因为所有的全局变量和函数都是作为window对象的属性和方法创建的。(全局执行环境知道应用程序退出-例如关闭网页和浏览器-时才会被注销)
9、作用域链的用途:是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端,始终是当前执行的代码所在环境的变量对象。
10、内部环境可以通过作用域链访问所有的外部环境吧,而外部环境不能访问内部环境中的任何变量和函数。这些环境之间的联系是线性的、有次序的
11、延长作用域链:档执行流进入下列任一一个语句时,作用域链就会得到加长:
(1)try-catch语句的catch块;
(2)with语句
这两个语句都会在作用域链的前端加上一个变量对象。
12、JS没有块级作用域。对于有块级作用域的语言来说,for语句初始化变量的表达式所定义的变量,只会存在于循环的环境之中。但是对于JS来说,由于for语句创建的变量i将会在for循环执行结束后,依旧存在于循环外部的执行环境中。
13、查询标识符:搜索过程从作用域链的前端开始,向上逐渐查询与给定名字匹配的标识符。
14、垃圾收集:找出那些不再继续使用的变量,然后释放其占用的内存。
15、标记清除:JS中最常用的垃圾收集方式。原理:垃圾收集器在运行的时候回给内存中的所有变量都加上标记。然后,它会去掉环境中的变量以及被换将中的变量引用的变量的标记,而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了,最后垃圾收集器完成内存清除工作。
引用计数:跟踪记录每个值被引用的次数。档垃圾收集器下次再运行时,它会释放那些引用次数为0的值所占用的内存。
16、IE的JS引擎是使用标记清除策略来实现的,而COM对象的垃圾收集机制是基于引用计数策略的。
17、一旦数据不再游泳,最好通过将其值设置为null来释放其引用-这个方法叫做解除引用。解除一个值得引用并不意味着自动回收所占用的内存。解除引用的真正作用是让值脱离执行的环境,以便垃圾收集器下次运行时将其回收。