对象和数组
对象和数组是两种基本数据类型
创建对象
两种解释:将多个数据值集中在一个单元里并使用名字来存取这些值;无序属性集合
创建对象最简单的办法就是加入对象直接量(用逗号分隔开的一对对属性名和值的列表,包含在一个大括号之中)
例如
varempty={};
varpoint={x:0,y:0};
varcircle={x:point.x,y:point.y+1,radius:2};
var home={
"name":"Homer Simpson",
"age":35,
"married":true,
"occupation":"plant operator"
}
var a=newArray();
var d=newDate();
var r=newRegExp("javascript","i");
对象属性
属性枚举
使用for/in循环提供了一种遍历对象的方法
例如
function DisplayPropertyNames(obj){
varnames="";
for(varname in obj){
names+=name+"\n";
}
alert(names);
}
属性存在性检查
in运算符可以用来测试一个属性的存在性。运算符的左边应该是属性的名字(字符串形式),而运算符的右边应该是要被测试的对象。==等于,===严格等于
例如
if("x" in o) o.x=1;
if(o.x!==undefined) o.x=1;
o.x=undefined;
删除属性
使用delete运算符来删除一个对象的属性
例如
delete o.x;
作为关联数组的对象
可以用.来存取一个对象的属性,而数组更常用的属性运算符是[] ,下列两个表达式值相等
o.x;
o["x"];
这两条语法之间最重要的区别是,前者的属性名是标识符,后者的属性名是字符串。在c,c++,java和其他类似强类型语言中,一个对象的属性数是固定的,而且必须预定义这些属性。javascript是一种松类型的语言,并不采用这一规则,所以在使用javascript编写的程序中,可以为对象创建任意数目的属性。但如果使用 . 来存取一个对象的属性时,属性
varaddr="";
for(i=0;i<4;i++){
addr+=customer["address"+i]+"\n";
}
通用的object属性和方法
Constractor
每个对象都有一个constructor属性,它引用了初始化这个对象的构造函数,例如,使用date()构造函数创建了一个对象d,属性d.constructor引用Date。通过这一点可以使用如下代码来确定一个未知值得类型:
if(typeof o=="object" &&(o.constructor==Date))
运算符检查instanceof ,因此,上面的代码也可以写成
f(typeofo=="object" && (o instanceof Date))
Tostring
它返回一个某种程度上代表着对象值的一个字符串。当JavaScript需要把一个对象转换为一个字符串的时候就会调用这个方法,后面会介绍如何定制tostring方法
toLocaleString
返回对象的一个本地化字符串表示
valueOf
需要把一个对象转换成某种基本数据类型调用的方法,后面会介绍如何定制一个对象的valueof方法
hasOwnProperty
如果对象用一个单独的字符串参数所指定的名字来本地定义一个非继承属性,该方法就返回true。否则就返回false
propertyIsEnumerable
如果对象用一个单独的字符串参数所指定的名字来定义一个非继承属性,并且如果这个属性可以在for/in循环中枚举,该方法就返回true,否则就返回false。 后面将介绍属性继承
isPrototypeOf
如果该方法所属的对象是参数的原型对象,那么该方法就返回true。后面将介绍原型方法
数组
创建数组的最简单的方法就是使用数组直接量,以逗号分隔开;值不一定要求是常数,它们可以是任意的表达式。数组直接量可以包含对象直接量或者其他数组直接量
另一种方式是使用Array()构造函数。可以以三种不同的方式来调用这个构造函数
无参数调用
var a=new Array();
显式的指定前n个元素的值
var a=new Array(1,2,3,54);
传递一个指定了数组长度的数字
var a=new Array(10);
数组元素的读和写
可以使用[]运算符来存取元素。在方括号的左边应该是对数组的引用,方括号之中是具有非负整数值的任意表达式,既可以用来读,也可用来写
value=a[0];
a[1]=3;
i=2;
a[i]=4;
a[i+1]=3;
a[a[i]]=a[0];
同时,前面也提到[]运算符可以用来访问对象已经命名的属性
my["salary"]*=2;
注意,数组的下标必须是大于等0小于等于232-1的整数,若太大会将它转换为一个字符串以属性方式访问
添加数组新元素
要给一个数组添加新的元素,只需要赋一个值即可
a[10]=10;
在JavaScript中数组是稀疏的(sparse),这意味着数组下标不必落在一个连续的整数范围内,只有真正存储在数组中的元素才能够由JavaScript实现分配到内存。因此执行下列几行代码时,JavaScript解释器只给数组下标为0和10000的元素分配到内存
a[0]=1;
a[10000]=1;
注意,数组元素也可以被添加到对象中
var c=new circle(1,3,4);
c[0]="this is a cat ";
删除数组元素
delete运算符把一个数组元素设置为undefined值,但是元素本身还继续存在。要真正删除一个元素,以使下标位置高于他的所有元素都下迁到较低的下标位置,需要使用一个数组方法。Array.shift()方法删除数组的第一个元素。Array.pop()方法删除掉最后一个,array.splice() 从一个数组中删除一个连续范围内的元素
数组的长度
数组的下标必须小于232-1,意味着length属性的最大值时232-1
遍历数组
常见的遍历数组的办法
Var fruits=["mango","banana","cherry"];
For(varu=0;i<fruits.length;i++){
Alert(fruits[i]);
}
这样使用假定数组是连续的,若不是连续的,就需要判断一下每个元素是否被定义了
Var fruits=["mango","banana","cherry"];
For(varu=0;i<fruits.length;i++){
If(fruits[i])
Alert(fruits[i]);
}
截断或增长数组
数组的length既可以读也可以写。如果设置了一个比它当前值要小的值,那么数组会被截断。长度以外的元素会被抛弃。如果给的值比当前值要大,新的未定义的元素会加到数组末尾。
注意,尽管可以将对象赋给数组元素,但是对象没有length属性。就是这点特殊行为而言,length元素成了数组最重要的特性
多维数组
虽然JavaScript不支持多维数组,但是它允许是元素称为数组的数组,这就非常接近多维数组。取一个数组的数组中的元素只需要使用两次[]即可。
数组的方法
Join
把一个数组的所有元素都转换为字符串再连接
Reverse
返回数组元素顺序颠倒后的数组
Sort
将数组排序,若不传参数默认以字母顺序排序。还可以传入比较函数进行自定义排序
a.sort(function(a,b){returna-b;})
Concat
创建并返回一个数组,这个数组包含了调用这个方法的原始数组的元素和concat的参数。如果有些参数是数组,那么将会被展开。但concat并不会递归的展开一个元素为数组的数组-----只能展开一层
Slice
返回指定数组的一个片段或者是子数组,如果只传入一个参数,那么返回从起始位置到原数组结束位置所有的元素,如果是两个参数,中有一个是负数,那个参数指定的是相对于数组中最后一个元素而言的元素
例如
-1指的是最后一个元素
-3是最后一个元素起倒数第三个元素
Splice
插入和删除数组的通用方法,在原数组上修改数组
它可以把元素从数组中删除,也可以把新元素插入到数组中,或者同时进行两个操作。位于被插入了或删除了的元素后的数组元素会进行必要的移动,以便删除的元素和剩下的元素能保持连续性。Splice()第一个参数指定了要插入或删除的元素在数组中的位置。第二个参数指定了要从开始元素处到数组结尾处的所有元素。Splice()返回了删除元素后的数组,如果没有删除任何元素,那么将返回一个空数组
Vara=[1,2,3,4,5,6,7,8];
a.splice(4);//returns [5,6,7,8] ;a is [1,2,3,4]
a.splice(1,2);//returns[2,3];a is[1,4]
a.splice(1,1);//returns[4];a is[1]
前两个参数指定了应该删除的元素。这两个参数后还可以有任意多个额外参数,指定了从第一个参数指定位置开始插入的元素
Var a=[1,2,3,4,5]
a.splice(2,0,'a','b');//returns[]; a is[1,2,'a','b',3,4,5]
和concat不同,splice并不会将传入的数组参数展开----插入的是数组本身而不是数组的每一个元素
Push & pop
可以像使用堆栈一样使用数组
Unshift & shift
和push pop十分相似,差别在于是在数组的头部进行操作
toString & tolocaleString
其他
还有一些有趣的函数
Indexoflastindexof
Foreach 为数组中每一个元素执行一个指定的函数
Map 返回数组中的每一个元素传递个一个指定函数所获取的结果的数组
Filter 返回一个给定断言函数返回true的元素所组成的一个数组