JavaScript(六)

基本类型值:指的是简单的数据段

引用类型值:指那些可能有多个值构成的对象

引用类型的值是保存在内存中的对象。与其它语言不同,JavaScript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。

动态的属性:

定义基本类型之和引用类型值的方式是类似的:创建一个变量并为该变量赋值。对于引用类型的值,我们可以为其添加属性和方法。不能给基本数据类型的值添加属性。

复制基本类型的值:会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上。此后,两个变量可以参与任何操作而不会相互影响

复制引用类型的值:同样会将存储在变量对象中的值复制一份放到新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量就会影响另一个变量。

在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即命名参数),在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。

即使在函数内部修改了参数的值,但原始的引用仍然保持未变。当在函数内部重写obj时,这个变量引用的就是一个局部对象了。而这个局部对象会在函数执行完毕后立即被销毁。

 检测类型:

instanceof操作符:

result=variable instanceof constructor

eg: alert(person instanceof Object);

所有引用类型的值都是Object的实例。

执行环境

内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。

延长作用域链:

try-catch语句的catch块;

with语句;

在作用域链的前端添加一个变量对象,对with语句来说,会将指定的对象添加到作用域链中。对catch语句来说,会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明。

没有块级作用域:

在JavaScript中,if语句中的变量声明会将变量添加到当前的执行环境(在这里是全局环境)中。

对于JavaScript来说,由for语句创建的变量i即使在for循环结束后,也依旧会存在鱼外部的执行环境中。

使用var声明的变量会自动被添加到最接近的环境中。在函数内部,最接近的环境就是函数的局部环境;在with语句,最接近的环境就是函数环境。如果初始化变量时没有使用var声明,该变量会自动添加到全局环境。

查询标识符:搜索过程从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符。如果在局部环境中找到了该标识符,搜索过程停止,变量就绪。如果在局部环境中没有找到该变量名,则继续沿作用域链向上搜索。

管理内存:确保占用最少的内存可以让页面获得更好的性能,而优化内存的最佳方式,就是执行中的代码只保存必要的数据。一旦数据不再有用,最好通过将其值设置为null来释放其引用(解除引用)。这一做法适用于大多数全局变量和全局对象的属性。局部变量会在他们离开执行环境时自动被解除引用,接触一个值得引用并不意味着自动回收该值所占用的内存,解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其收回。


评论

© 完全感觉Dreamer | Powered by LOFTER