用delete运算符把一个元素设置为一个undefined值,但是元素本身还继续存在,要真正地删除一个元素,那么必须使用一个数组方法。(当用方法移出了一个元素后,再去访问该元素,虽然也会返回一个undefined值,但用length属性去测试会发现长度变短了,说明是真正的移出了一个元素;但是仅仅用delete运算符去删除一个元素,用length属性去测试时会发现长度没有变,说明没有真正移出元素!)
(3).数组长度(length属性)
(4).截断或增长数组
Length属性是可读可写的,通过修改length的值可以截断和增长数组的长度。
(5).多维数组
JS不支持真正的数组,它支持数组的数组,即变长数组!
Var a=new Array(10);
For(var b=0;b<a.length;b++)
{
A[b]=new Array(10);
}
(6).数组方法
参考API去
(七).函数
7.1函数定义和调用
JS也不会检测传递的数据是不是那个函数所要求的类型,也不会检测传递给它的参数个数是否正确。如果传递的参数比函数需要的个数多,那么多余的值会忽略掉; 如果传递的参数比函数需要的个数少,那么所被忽略的参数就被赋予undefined。
7.1.1函数直接量
Var f=function(x) {return x*x;}
或
Var f=fucntion fact(x) {return x*x;}//也可以加函数名字
Var test=(function(x) {return x*x;})(10);//定义后马上调用
7.1.2函数命名
函数名小写字母开始!
7.2函数参数
7.2.1.可选参数
它是利用了当传递给函数的参数个数小于函数的参数时,其它的参数有一个undefined值。要用可行参数时,必须能够为忽略掉的参数分配一个默认的合理值。
Function test(o, a){
a=a || [];
for(var property in o) a.push(property);
return a;
}
注意,在使用可选参数时,应该确保把可选参数放在参数列表的末尾。
7.2.2.可变长度的参数列表:arguments对象
Arguments并不是一个数组,它是一个对象,它虽然定义了带编码的元素和length属性。Arguments对象允许完全地存取那些实际参数值,即使某些或全部参数还没有被命令。例如有一个函数f,它定义了一个参数x,但是调用f时传递给了它两个参数,那第个一参数可以用x或arguments[0]可以存取第一个参数,而第二个实际参数只能通过arguments[1]来存取。
一般argumetns对象来编写这样的函数:期待固定数目的具有名字的且必须的函数,紧接着是任意数目的没有命名的可选参数。
Arguments[]数组和命名了的参数不过是引用同一变量的两种不同方法。相反,用参数名改变一个参数的值同时会改变通过arguments数组获得的值;通过arguments[]数组改变参数的值同样会改变用参数名获取的参数值。
记住,arguments只是一个普通的JS标识符,而不是一个保留字,如果函数有一个参数或者局部变量使用了这个名字,它就会隐藏对arguments对象的引用。
属性callee
Arguments对象用callee属性来引用当前正在执行的函数!!
7.3作为方法的函数
Var calculator={
Operand1:1,
Operand2:2,
Compute:function(){
This.result=this.operand1+this.operand2;}
任何用作方法的函数都被效地传递了一个隐式的参数,即this,调用对象。
当一个函数作为函数而不是作为方法调用的时候,这个this关键字引用全局对象.
当一个嵌套的函数(作为函数)在一个包含的函数之中调用,而这个包含的函数是作为方法调用的,this关键字在包含的函数中有一个值,但是它却引用嵌套的函数体的内部的全局对象。
7.4 函数的属性和方法
7.4.1属性length
这个属性是只读属性,返回的是函数需要的实际参数的数目,也就是在函数的开式参数列表中声明的形式参数的数目。注意,和arguments.length不同,这个length属性在函数体的内部和外部都有效。
7.4.2定义自己的函数属性
当函数需要使用一个在调用过程中都保持不变的值时,使用function对象的属性比定义全局变量更加方便。也即我们可以为函数定义属性。
例:
UniqueInteger.counter=0;
Function uniqueInteger(){
Return uniqueInteger.counter++;}
这里的counter相当于函数的静态局部变量一样!!!
7.4.3方法apply()和call()
Call和apply的第一个参数都是要调用函数的对象,在函数体内这一参数是关键字this值。Call()剩余的参数是传递给要调用的函数的值。
例:
F.call(o,1,2)
上例是把两个数字传递给函数f(),并将它作为对象的方法调用。
Apply()传递给函数的参数是由数组指定的。
F.apply(o,[1,2]):
7.5函数作用域和闭包
7.5.1词法作用域
JS函数是通过记法来划分作用域的,而不动态地划分作用域的。这意味着,它们在定义它们的作用域里运行,而不是在执行它们的作用域里运行。当定义一个嵌套的函数时,作用域链就包括外围的函数。这意味着嵌套的函数可以访问包含函数的所有参数和局部变量。
7.5.2作为闭包的嵌入函数
如果定义了一个嵌套的函数,这个函数引用了调用对象,因为调用对象在这个函数所定义的作用域链的顶端。如果一个嵌套的函数只是在外围函数的内部使用,那么,对嵌套函数的唯一引用在调用对象之中。当外围函数返回的时候,嵌套的函数引用了调用对象,并调用对象引用了嵌套的函数,(互相引用??)但是没有其它的东西引用它们二者,因此对这两个对象进行垃圾回收。
如果把一个嵌套的函数的引用保存到一个全局作用域中,情况不同了。使用嵌套函数作为外围函数的返回值,或者把嵌套的函数存储为某个其他对象的属性来做到这一点。在这种情况下,有一个对嵌套的函数的外部引用,并且嵌套的函数将它的引用保留给外围函数的调用对象。结果是外围函数的一次特定调用的调用对象依然存在,函数的参数和局部变量的名字和值在这个对象中得以维持。JS代码不会以任何方式访问这个调用对象,但是它所定义的属性是对嵌套函数任何调用的作用域链的一部分。(注:如果一个外围函数存储了两个嵌套函数的全局引用,这两个嵌套函数共享同一个调用对象,并且,一个函数的一次调用所做出的改变对于另一个函数的调用来说也是可见的)
JS函数是将要执行的代码以及执行这些代码的作用域构成一个综合体,叫闭包。