现在的位置: 首页 > 综合 > 正文

再读《悟透javascript》之一、JavaScript基础

2013年08月04日 ⁄ 综合 ⁄ 共 3443字 ⁄ 字号 评论关闭

引言

      编程世界只存在两种基本元素:一个是数据、另一个是代码。无论多么复杂的程序,都是对数据和代码间千丝万缕的关系进行的操作。

 

 

一、回归简单,JavaScript的数据类型

1.       简单数据类型

1)       undefined:代表一切未知的事物,什么也没有(注意:typeof(undefined)也是undefined

2)       null:有一个空间,但空间中没有数据

3)       boolean:布尔类型

(1)    undefined,null,’’,0转换为布尔类型,结果都为false,其它一切值转换成布尔类型都为true,例:alert(Boolean(undefined));

(2)     ===:全等,表示类型和值都要相等,例:alert("123"==123);alert("123"===123);

4)       number:数值类型

5)       string:字符串类型

 

 

2.       复杂数据类型,只有object类型

JavaScript中不要被类所束缚,JavaScript没有类的概念,因为它已将类化为无形与对象溶为一体了,看下面的代码:

        var life = {};

        for(life.age=0; life.age<3; life.age++){

            switch(life.age){

                case 0:life.body="卵细胞";

                       life.say=function(){alert("now i'm a "+this.body);}

                       break;

                case 1:life.body="小蝌蚪";

                              life.tail="尾巴";

                       life.say=function(){alert("now i'm a "+this.body);}

                       break;

                case 2:life.body="青蛙王子";

                              delete life.tail;

                              life.legs="";

                       life.say=function(){alert("now i'm a "+this.body);}

                       break;

            }

           

            life.say();

}

上面可以看到,一个life对象从卵细胞变成小蝌蚪再变成青蛙王子,是多么的有趣,这就是JavaScript的魅力,life不是某个类的固定的实例化对象,它 是如此的灵活,并不局限于某个固定的类;假如我们用面向对象的思想来编写的话,会怎样呢?那么我们就需要建立三个类来反映life生命中的三个阶段,然后再来编程,假如life对象有十个生命过程呢?my god那就要十个对象了,那再多一点~~~~~~,面向对象是为了帮助我们理解问题解决问题的,当它成为了我们的阻碍时,我们就要坚决地抛弃它。

 

 

3.       function,函数,程序之神

1)       静态函数:function xxx(){…},如果在同一个程序段内,出现同名的静态函数,那么该函数将以最后位置的函数为准。例:

<script type="text/javascript">

        function test(){alert("hello");}

        test();

        function test(){alert("hi~~~");}

test();

</script>

我们会看到,它两次都弹出hi~~~,即最后位置的函数。

 

 

2)       动态函数:var xxx = function(){…},动态函数不存在静态函数同名的问题,在程序执行到时,最后赋值的函数就是要调用的函数。例:

    <script type="text/javascript">

        var test = function(){alert("hello");}

        test();

        var test = function(){alert("hi~~~");}

        test();

</script>

这里我们可以看到,程序先弹出hello,后弹出hi~~~,第一个test执行前赋值的是弹出hello的函数,而第二个test执行前赋值的是弹出hi~~~的函数。

 

 

3)       JavaScript是一段段地分析执行函数,而不是一行行地分析执行,如果将上面的静态函数的例子拆成两个程序段,就可以看出来,例:

<script type="text/javascript">

        function test(){alert("hello");}

        test();

</script>

<script type="text/javascript">

        function test(){alert("hi~~~");}

test();

</script>

可以看到,程序先输出hello后输出hi~~~,证明了JavaScript是一段段的执行的。

一段代码中的静态函数会优先执行,这一特征被称为“JavaScript的预编译”,事实上,JavaScript的预编译还包括对所有var变量的创建(初始值为undefined),用以提高对代码的执行效率。(请注意此段话,后面会有示例)

 

 

二、变量、属性、作用域

1.       任何程序都会在一个原始的环境中开始运行,这个原始的环境被称为“全局环境”,全局环境包含一些预定义的元素,这些元素对于我们的程序来说是自然存在的,我们直接拿来即可用,就像我们呼吸的空气一样。在JavaScript中,这个全局环境就是window对象。

 

 

2.       变量与属性

1)       变量:var myName=”luo”;这里声明了一个变量

2)       属性:myName=”soldierluo”;这里定义了一个属性

 

 

3.       变量的作用域只在函数体内,而属性则没这样的限制,这样的安排是JavaScript的一个极大的特点,请特别注意,例:

    <script type="text/javascript">

    var firstName = "luo";

    var lastName = "jun";

    fullName = "soldierluo";

    alert("firstName:"+firstName+" lastName:"+lastName+" fullName:"+fullName);

    function test(){

        alert("firstName:"+firstName+" lastName:"+lastName+" fullName:"+fullName);

        var firstName = "soldier";

           lastName = "kkk";

        fullName = "changed";

        alert("firstName:"+firstName+" lastName:"+lastName+" fullName:"+fullName);

    }

    test();

    alert("firstName:"+firstName+" lastName:"+lastName+" fullName:"+fullName);

</script>

上面这个例子非常有意思,程序总共弹出了四次,firstNameluo->undefined->soldier->luo;而lastNamejun->jun->kkk->kkkfullName则是soldierluo->soldierluo->changed->changed

看来变量lastName和属性fullName比较像呢!为什么同是变量的firstName反而更不同呢?因为作用域,请看test函数中也声明了一个

抱歉!评论已关闭.