《javaScript高级程序设计》阅读:5-变量、作用域和内存问题
1、基本类型和引用类型
基本类型:简单的数据段
引用类型:由多个值构成的对象
2、动态的属性:
创建一个变量的方法都是一样的,声明一个变量,为该变量赋值。
操作:只能给引用属性动态的添加属性。
3、复制变量
基本变量复制时,会在变量上创建一个新值,然后再把它复制到新的位置上去。通俗点说。就是新复制的是完成独立,和之前的变量无关。
而对象就不一样:见下图:对象是复制了一个指针,指向同一个内存空间,所以,改变的时候,会影响另外一个对象。
4、传递参数:es中所有的参数都是按值传递的。
5、检测类型:typeof和instanceof的区别:
typeog():可以返回基本类型和object,但是不知道是具体什么类型的object。
instanceof:根据原型链识别。可以检测是不是object,array,regexp。
语法: result = variable instanceof Object 返回Boolean值。
6、执行环境和作用域
执行环境定义了变量或函数有权访问其他数据,在执行环境里面有一个与之相关的变量对象
变量对象:环境中定义的所有变量和函数都保存在这里面。
每个变量都有自己的执行环境。
当代码在一个环境中执行时,会有一个作用域链,作用域链的作用是保证对变量的有序访问,全局的环境是作用域链的最后一个对象。
内部环境可以访问外部环境的变量,但是外部环境不能访问内部环境的变量。
且访问变量是根据作用域链一层一层向上查找。
7、没有块级作用域
if函数中,定义的变量会添加到当前的作用域。
for中创建的i变量在当前的作用于也依然存在。
8、垃圾回收:原理:找出不再使用的变量,然后释放内存
方法:标记清除&&引用计数(有bug)