zoukankan      html  css  js  c++  java
  • Javascript 你不知道的几个内置类型

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

  • 相关阅读:
    maven工程的目录结构
    集合的区别
    名词解析
    1.(字符串)-判断字符串是否是子集字符串
    1.(字符串)-判断两字符串是否相等
    python max函数技巧
    1.(字符串)-子字符串位置查找
    numpy线性代数np.linalg
    Python图像库PIL 使用
    pyhthon-chr
  • 原文地址:https://www.cnblogs.com/xuld/p/2052155.html
Copyright © 2011-2022 走看看