博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Javascript 你不知道的几个内置类型

Posted on 2011-05-20 16:49  xuld  阅读(613)  评论(1编辑  收藏  举报

说到Javascript的内置类型,已知的有 Boolean Number String Object RegExp Function Array Date Undefined Null  。

但,

真的就这么多么?

其实还有3个类型

这3个类型是Javascript执行器使用的类型,它们不能在代码中直接使用。

了解它们可以让你的代码更出色。

这三个类型分别是  Reference  List   Activation 。

List 是最好理解的,它们用于存储多个值的列表。

我们知道,在函数被执行的时候, 可以使用 arguments 来获取当前的参数。

但是,

arguments 是什么类型 ?

Object ? ---- 通过Javascript代码可以认为它是 Object 。

不过, arguments 又和数组一样,可以使用索引和 length , 它又可以是 Array  类型。

其实,

arguments 的类型就是 List 。

List类型用来存储临时的参数列表。

Reference 是引用。

Reference 有2个属性,分别是 Base 和 PropertyName  ,它表示一个对象的某个属性名字的引用。

系统执行的时候,需要一个空间保存上代码执行的返回值。 比如执行如下代码 : 2 + 4  后, 保存的返回值是 Number:6

当执行这样的代码时,obj.prop  保存的返回值不是 obj.prop 对应的值。

在js中,假如某个对象的某属性不存在,不会报错。如果 obj.prop 执行之后保存返回值,则肯能出错,因为 obj.prop 可作为左值,比如

obj.prop = 2;

这时 obj.prop 是表达式,但作为左值使用, 如果存储返回值,那 obj.prop = undefine .最后就是 undefined  = 2 , 这样是不行的。

所以 js内部有个 Reference , obj.prop 返回的是 Reference 实例 ( Base-> obj  PropertyName -> prop)

Base 可以是任何变量,当Base 是全局变量时, 如果 PropertyName 不存在, Reference 会报错。即

var a = b; // b  是全局对象, 表达式 b 执行后,返回 Reference( Base -> window ProperyName -> b)

因为 Base 是全局对象,并 找不到 b 属性, 所以报错。相信细心的你可以发现, Javascript 在出现找不到变量的时候,抛出的是 ReferenceError  错误。 

try{
var v = sth;
}
catch(e){
alert(e);
}

最后一个是 Activation 。 其实它是隐藏地最好的。

Javascript的所有变量都是属于某一个对象的。比如全局变量属于 window  。 那被闭包的变量呢?

每个函数执行时,会产生内部变量的一个闭包。

function by_xuld() {
var obj = new Object();

return obj;
}


alert(by_xuld()
=== by_xuld());

实验证明,同个函数在每次执行的时候,都会创建一个 obj 的变量。那 obj变量是如何存储的?

是不是一个函数就有一个存储内部的变量的空间?

当然不是, 如果一个函数自己有存储变量的位置, 那么同个函数不肯能出现2个不同的变量。

其实,每个函数在执行的时候,就会创建一个临时的作用域,所有的内部变量都保存成这个 作用域的属性。 比如函数内的 var 定义的, 这个作用域本质是  Activation 类型的一个变量。 无法用Javascript 访问这个变量自己,但可以访问这个变量的属性。(注意 Activation 是作用域, 不是 this 指向 )

当函数内部执行了 var obj ; obj; 时 , 最后返回的是 Reference 对象, 其 Base 是  Activation   。

这3个类似是Js执行器必须的。 知道这几个类型之后,你就可以知道:

闭包的原理

类型容错原理 ( 为什么 typeof a   当a 没定义 不出错   )