• JavaScript讲义(二)


    语句:
    -----------------------------------
    基本执行单位,所有语句都以分号结束
    with语句可以避免重复输入,比如
    with(document)
    {
    writeln("a");
    writeln("b");
    writeln("c");
    }

    流程控制:
    -----------------------------------
    分支:
    循环
    for,while,do while
    for in:本质是一种foreach循环,遍历数组元素和遍历JS对象所有属性。比如:
    for(propName in navigator)
    {
    document.write(propName+':'+navigator[propName]);

    函数:
    -----------------------------------
    一等公民,函数本身是一个对象,其完全可以作为一个类使用。
    定义命名函数
    定义匿名函数:
    function(poarameter list)
    {
    };
    //这种函数定义无须指定函数名,将参数列表紧跟function关键字。最后紧跟分号
    使用Function类匿名函数:
    该类可用于定义函数,比如
    var f = new Function('name',"document.writeln('adaf<br>');");
    上面代码用new Function()定义了一个匿名函数,将该匿名函数赋给f变量,从而通过f访问匿名函数。最后一个字符串代表函数执行体。

    局部函数:外部不能访问

    函数的实例属性和类属性:函数不仅是函数,而且是类,该函数还是此类唯一的构造器。函数中的变量有3种:
    局部变量:普通方式声明
    实例属性:在函数中以this前缀修饰的变量。
    类属性:在函数中以函数名前缀修饰的变量。
    实例属性(this前缀修饰)必须通过对象访问,类属性(函数名前缀)必须通过类(也就是函数)访问。比如,
    function Person(national,age)
    {
    this.age=age;
    Person.national=national;
    var bb=0;
    }
    JS与java不一样,它是一种动态语言,允许随时为对象增加属性和方法。当我们直接为对象的某个属性赋值时,即可视为给对象增加属性。

    调用函数的3种方式:
    直接调用:比如window.alert("sdfafs");
    以call()调用:其语法格式为函数引用.call(调用者,arg1,arg2...)。
    以apply()调用:与call()区别在通过call()调用函数时,必须详细列出每个参数,而apply()可以在括号中以arguments代表所有参数。
    比如
    myfun.call(window,12,23);
    myfun.apply(this,arguments);

    函数的独立性:因为是一等公民,它不从属于任何对象和类。


    函数的参数处理
    -----------------------------------------------------------
    JS函数的参数传递全部采用值传递方式,当通过实参调用函数时,传入函数里的并不是实参本身,而是实参的副本。
    对于复合类型的参数,实际上依然采用值传递,只是很容易混淆。
    function changeAge(person)
    {
    person.age=10;
    person=null;
    }
    var person={age:5};
    changeAge(person);
    上面的关键是,复合类型的变量本身并未持有对象本身,复合类型的变量只是一个引用,该引用指向实际的javaScript对象。当把person复合类型的变量传入changeAge()时,传入的依然是person变量的副本,只是该副本和原person变量指向同一个JS对象。

    空参数:没有任何程序问题,只是传入实参的参数值将作为undefined处理。

    参数类型:参数列表无须类型声明,这一点为函数调用埋下了隐患。比如:
    function changeAge(p)
    {
    p.setAge(34);
    }
    传入p完全可以是整形/布尔型变量,这些类型的数据都没有setAge()方法,但程序强制调用该方法,肯定导致程序出错。所以JS不如Java,C语言程序健壮。
    为了解决弱类型语言这种问题,Duck Type被提出。先判断入参对象是否能发出嘎嘎声,并具有走路左右摇摆的特征,程序可以把它当成鸭子使用。如果弱类型语言的函数需要接受参数,则应先判断参数类型,并判断参数是否包含了需要访问的属性、方法。

    使用对象
    ----------------------------------------------------
    为了更好的软件复用,建议使用对象和函数
    JS不允许指定类与类之间的继承关系,所有类都是Object的子类。

    对象和关联数组:JS对象与纯粹的面向对象语言的对象存在区别,JS对象本质是一个关联数组,或者更像Java里的Map数据结构,由一组key-value对组成。与Java中Map对象的区别是,JS对象的value不仅可以是值也可是函数,此时函数就是该对象的方法;当vvalue是基本类型或复合类型的值时,此时的value是该对象的属性值。当需要访问某个对象的属性时,不仅可以obj.propName,也可以obj[propName],有时甚至必须用这种形式。比如
    for(propName in p)
    {
    document.writeln(propName+":"+p[propName]);
    }
    遍历了Person对象的每个属性,因为遍历每个属性时循环计数器是Person对象的属性名,因此程序必须根据属性名来访问,此时不能用p.propName,因为JS不会把propName当成变量处理,它试图直接访问该对象的propName属性,但该属性实际并不存在。

    创建对象
    ----------------------------------------------------
    JS对象只是一种特殊的关联数组。创建对象有3种方式:
    用new调用构造器,比如var p1=new Person();
    用Object直接创建对象,比如var myObj=new Object();myObj.name='sfsf';
    用JSON语法创建对象:
    JSON已经发展成一种轻量级的,跨语言的数据交换格式。用JSON语法可以避免书写函数,也可避免用new,可以直接创建一个JS对象。
    比如var p={"name":'sdfsfs',"gender":'sdfsdf'
    };

  • 相关阅读:
    Jenkins Install
    提高C#代码质量的22条准则
    游戏程序员英文指南
    苹果设备内存指南
    Unity符号表
    UI优化策略-UI性能优化技巧
    C# 语言历史版本特性
    CPU SIMD介绍
    Unity渲染性能指标
    关于JMeter线程组中线程数,Ramp-Up Period,循环次数之间的设置概念
  • 原文地址:https://www.cnblogs.com/jinji/p/6018017.html
Copyright © 2020-2023  润新知