对象和数组是一个值的集合,对象是已命名的值的集合,数组是一个特殊的对象,它里面的值是有序的。
对象
对象是一个无序的属性集合,每一个属性都有自己的名字和值。对象的直接量:
var empty = {};
var point = {x:0, y:0};
对象的属性名可以是标示符或者字符串,属性值可以是任意表达式。
new运算符也可以创建一个对象,例如下面创建了object对象子类:
var a = new Array();
var b = new Date();
var c = new RegExp("xxxx", "ii");
对象的属性
对于对象不管使用直接量还是用new运算符,对象一旦初始化完成都可以使用“.”来操作对象的属性,获得对象属性对应的值。
<html>
<head>
<title>object</title>
</head>
<body>
<script>
var o = new Object();
alert(o.test);//undefined 未定义
o.test = "123"; // 这样就可以给这个对象添加一个属性
alert(o.test);//123
</script>
</body>
</html>
对象属性的枚举可以使用for/in 循环遍历对象,从而得到对象的所有的属性名:
for (var name in o){
alert(name);//name就是对象名
}
但是这样就会有一个问题,如何获得对象名的值。“.” 的右边必须是一个标示符,对于现在的属性名是一个变量,所以无法使用“.”。
关联数组对象:他是以[ ] 的形式来获得对象的属性名值,[ ] 里面可以字符串或表达式,这样就可以动态获得对象的属性值。
for (var name in o){
alert(o[name]);//123
}
判断一个对象属性是否存在可以使用in 或者 该属性值是否等于undefined
var o = new Object();
o.test = "123";
if ("x" in o) o.x = "456";
if (o.x !== undefined) o.x = 1;
alert(o.x);//undefined
删除一个对象的属性可以使用delete 运算符:
var o = new Object();
o.test = "123";
delete o.test;
alert(o.test);//undefined
通用的Object 属性和方法
每一个对象都有一个constructor 属性,它引用的是初始化对象的构造函数。例如:
var d = new Date();
if (typeof d == "object") alert("object");
if (d.constructor == Date) alert("date");
if (d instanceof Date) alert("date");
toString() 方法:Object对象的toString 方法返回值是[object Object] 字符串,对于自己的对象都应该是要定制自己的toString 方法。
toLocaleString() 方法:作用是返回对象的一个本地化字符串,Object 对象toLocaleString() 方法和 toString() 方法的返回值是一样的。
valueOf() 方法:它是当javascript 需要把一个对象转换为某种基本数据类型,也就是一个数字而不是一个字符串的时候,才调用的方法。
hasOwnProperty() 方法:如果对象用一个独立的字符串参数所指定的名字来本地定义一个非继承的属性,hasOwnProperty() 方法就会返回true。否则,返回false。
propertyIsEnumerable() 方法:如果对象用一个单独的字符串参数所指定的名字来定义一个非继承的属性,并且如果在这个属性可以在一个for/in 循环中枚举,propertyIsEnumerable() 方法就返回true,否则返回false。
isPrototypeOf() 方法:如果isPrototypeOf() 方法所属的对象是参数的原型对象,那么,该方法就放回true。否则,返回false。
数组
数组是一个有序的、值的集合。每一个值叫做一个元素(element),每一个元素都有一个数组化的位置,叫做下标。
数组的直接量:数组的每一个element 可以是常量,也可以是一个表达式,或者是对象和数组。
var empty = [];
数组的下标是从0开始计数的。
使用构造函数创建数组:
无参数调用:var a = new Arrary();
指定n个值:var a = new Arrary(5, 4, 3, 2, 1, "12345");
指定长度:var a = new Array(10); 采用这个方式创建的数组初始化下标对应的值都是undefined。
数组元素的读和写
数组元素的读取可以直接使用[ ] 加数组下标,注意数组下标可以是数字或表达式,但一定要保证数字和表达式是一个正整数。
在javascript 中数组是稀疏的(sparse)。这意味着数组的下标不必落在一个连续的数字范围内,只有那些真正存储在数组中的元素才能够由javascript 实现分配到内存。
var a = new Array();
alert(a.length);//0
a[0] = 1;
a[1000] = 1000;
alert(a.length);//1001
alert(a[1]);//undefined
从上面的列子可以看出,在new a 数组时,它的初始化长度是为0。但对a[1000] 这个下标赋值时,同时也将数组的长度增加到了1001。实际分配到内存的只有a[0]和a[1000]两个下标位置,数组其他都是undefined。
删除数组元素:
delete:把一个数组元素设置为undefined 值,但这个元素的本身还是存在的。
Array.shift():删除掉数组的第一个元素。
Array.pop():删除点最后一个元素。
Array.splice():从数组中删除一个连续范围内的元素。
遍历数组:
数组的遍历一般都是用for 语句
var a = ["1", "2", "3"];
for (var i = 0; i < a.length; i++){
alert(a[i]);
}
数组的length属性:
数组的length属性是可以读写的,如果给数组的length属性附一个小于当前值,那么这个数组就会被截断了,也就是说值丢失了。如果附一个大于当前值,那么这个数组就会增长,但新增的数组元素都是undefined。
数组的方法
Array.join() 方法:可以吧一个数组所有元素转化成字符串。
Array.reverse() 方法:将颠倒数组元素的顺序并返回颠倒后的数组。
Array.sort() 方法:是在原数组上对数组元素进行排序,返回排序后的数组。
Array.concat() 方法:是在原数组上将concat方法后面的参数追加到数组中。
Array.slice() 方法:返回值是数组的一个片段。如果只传入一个参数,返回值是当前传入参数对应数组下标位置到数组结尾的子数组。也可以传入一个负数值-1对应的是数组的最后一位元素。
Array.splice() 方法:是在原数组上插入或删除数组元素的通用方法。第一个参数指定了要插入或删除的元素在数组中的位置。第二个参数指定了要从数组中删除的元素个数(第二个删除可以省略,那么就是从第一个参数位置删除到数组结尾)。第二个参数之后的参数就是要从第一个参数指定的位置开始插入的元素。
Array.push() 方法:是在数组尾部添加参数到数组中,然后返回数组的长度。
Array.pop() 方法:数删除数组最后一个元素,返回删除数组的元素。
Array.unshift() 方法:是在数组头部插入元素,并返回数组的长度。
Array.shift() 方法:是删除头部元素,并返回删除数组的元素。
Array.toSting() 方法:和无参数join 方法返回的字符串相同。