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'
};