JS学习(二) (2010-03-18 22:06:14)
标签: js it 分类: 程序语言
(引自:xiaofu)
(五).语句
5.1switch语句
ECMAScript v3标准允许case 语句扣跟随任意的表达式。例如:
Case 60*60:
Case Math.pi;
Case n+1;
注意:由于匹配的case表达式是用===等同运算符判定的,而不是用==运算符判定的,所以表达式必须在没有类型转换的情况下进行匹配。
5.2for/in语句
For(variable in object)
{statement
}
Variable应该是一个变量名,声明一个变量的var语句,数组的一个元素或者是对象的一个属性。Object是一个对象名。
在循环体执行之前,对象的一个属性名会被作为字符串赋给变量variable。在循环体中可以使用这个变量和[]运算符查询该对象属性的值。
注意,for/in循环中的variable可以是任意的表达式,只要它们的值适用于赋值表达式的的左边即可。
JS的数组是一种特殊的对象,因此可以像循环对象属性那样枚举数组下标。
如果for/in循环的主体删除了一个还没有枚举出的属性,那么该属性就不再枚举,如果循环主体定义了新属性,那么循环是否枚举该属性则由JS的实现决定。
For/in循环并不会遍历所有对象的所有可能的属性,那些被标记为只读的、永久的或不可列举的,这些属性使用此语句是枚举不出来的,所有用户自定义的属性可以枚举的!
5.3function语句
函数定义可以嵌套在其它函数定义中,但是只能嵌套在那些函数顶层中,也就是说,函数定义不能出现在IF语句,while语句或其它任何语句中。
在技术上说,function语句并非是一个语句.JS中语句会引发动态的行为,但是函数定义描述的却是静态的程序结构。语句是在运行时执行的,而函数则是实际运行之前,当JS代码被解析或被编译时定义的。当JS解析程序遇到一个函数定义时,它就解析并存储构成函数主休的语句,然后定义一个和该函数同名的属性(如果函数定义在其它的函数中,那么就在调用对象中定义这个属性,否则在全局对象中定义这个属性)以保存它。这会产生一些奇怪的行为。这认为它跟变量没有块级作用域特点有些相同。
例:
Alert(f(4));//displays 16
Var f=0;
Function f(x);
{
Reutrn x*x;
}
Alert(f);displays 0.f() has been overwritten by the variable f
出现这种情况是由于函数定义和变量定义出现在不同的时刻。
5.4return语句
如果一个函数执行了一个不带expression的return语句,或者因为它执行到了函数的尾部而返回,那么这个函数的表达式的值就是undefined。
5.5throw语句
Throw expression
Expression的值可以是任何类型的值,但通常它是一个Error对象或Error子类的一个实例。
5.6try/catch/finally语句
这个语句的使用和c#的使用差不多。
Try{} catch(e) {}finally{}
(六).对象和数组
6.1对象
6.1.1对象直接量
包含在一个花括号中,每个属性名可以是一个JS标识符或一个字符串或一个字符串,而每个属性值可以是一个常量或任意的JS表达式。
例:
Var empty={};
Var point={x:0,y:0};
Var homer={“name”:”homer”,”age”:34};
(2)new创建对象
Var d=new Date();
Var reg=new RegExp();
6.1.2对象属性
对象的属性和变量工作方式相似,即可以把值存储其中,也可以从中读取值。一旦通过给属性赋值创建了该属性,就可以在任何时刻修改这个属性的值。
Var book={};
Bool.widht=20//create
(1)属性的枚举
For/in语句枚举属性。
(2)检查属性的存在
In运算符可以用来测试一属性的存在
(3)删除属性delete运算符
删除属性并不是仅仅把属性设置为undefined,它实际上从对象中移除了属性,在删除之后,for/in将不会枚举该属性。
6.1.3作为关联数组的对象
就是用像读取数组的方式来读取属性值。
Obj.propery;
Obj[“property”]//关联数组
6.1.4通用ojbect属性和方法
1.constructor属性
每个对象都有一个constructor属性,它引用了初始化这个对象的构造函数。
例:
Var d=new Date();
d.constructor==Date//return true
2.hasOwnProperty()方法
如果此方法中指定的参数属性来自本地定义的一个非继承的属性,此方法返回true。
Var o={};
O.hasOwnProperty(“unde”);//return false,the property is not defined
O.hasOwnProperty(“toString”);//false,toString is an ihherited property
Math.hasOwnProperty(“cos”);//true:the Math object has a cos property
3.propertyIsEnumeralbe()方法
如果此方法中指定的参数属性来自本地定义的一个非继承的属性,并且如果这个属性可以在一个for/in循环中枚举,此方法返回true。
注意,一个对象的所有用户定义的属性都是可以枚举的,不能枚举的属性通常是继承的属性,因此这个方法几乎总是会和hasOwnProperty()返回相同的值。
4.isPrototypeOf()方法
如果此方法所属的对象是参数的原型对象,那么就返回true。
Var o={};
Object.prototype.isPrototypeOf(o);//true
Object.isPrototypeOf(o);//false
6.2数组
6.2.1创建数组
字面值创建数组
Var empty=[];
Var primes=[2,3,4];
Var misc=[1.1,true,”ik”];
直接量的值还可以是表达式
Var base=23;
Var table[base,base+3,base+4];
直接量还可以是对象直接量或数组直接量
Var b=[[1,{x:1,y:2}],2];
未定义的元素通过忽略逗号之间的元素值来创建
Var count=[1,,2];//数组有三个元素,中间的元素没有赋值
Var undef=[,,];//数组有2个元素,全部为赋值
用Array()构造函数创建数组
Var a=new Array():
Var b=new Array(3,2.3,4,”saf”,”sf”);
Var c=new Array(10);//这里的每个元素都没有赋值为undefined
6.2.2数组的读写
(1).添加数组新元素
JS中可以在任何时刻改变元素个数,而且由于JS数组是稀疏的,即数组的下标不必落在一个连续的数字范围内,只有那些真正存储在数组中的元素才能由JS实现分配内存。
例
a[0]=1;
a[100]=2;
这里JS解释器只给数组下标为0和100的元素分配内存,而试图访问其它的元素时将得到一个undefined
(2).删除数组元素