说到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 没定义 不出错 )