对象:
是一种复合数据类型,他们将多个数据值集中在一个单元中,而且允许使用名字来存取这些值。
创建对象:使用对象直接量----用逗号分隔开的一对对的属性名和值的列表,包含在一个花括号中,见例子:
var empty={}; var point={x:0,y:0}; var circle={x:point.x,y:point.y,radius:2}; var homer={"name":"Homer simpson","age":"34","married":true}; var book={}; book.title="javascript"; book.chapter1=new Object(); book.chapter1.title="introduction"; book.chapter1.pages=11; book.chapter2={title:"Lexical strcture",pages:6};
对象属性:
可以通过for(var prop in obj)迭代对象的所有属性;
通过obj.prop或obj[prop]来访问对象的属性。注意:[]中的表达式必须为一个字符串,无论属性在声明的时候是否用字符串来声明该属性,如var o={"x":1}和var o={x:1},访问时都使用o.x或o['x],而不能用o[x]和o.'x'。属性访问的两种方式:一种带字符串,另一种不带字符串,牢记!我们还会发现使用[]访问对象的属性比用.更加灵活,尤其是在访问我们都不知道名字的属性上。
检测属性的存在性:
if("x" in o)o.x=1;//只要o有x属性就复制
或者:
if(x.o!=undefined)x.o=1;//o的x属性必须不是null和undefined才赋值
区别在于当x.o=undefined或null时,前一条语句将o.x设置为1,后一条却什么也不做。所以,记得区分属性的存在性、null和undefined。如果还要在null和undefined中进行区分,可以使用!==运算符。
通用的Object属性和方法:
constructor属性:在JS中,每个object对象都有一个constructor属性,它引用了初始化这个对象的构造函数:
var d=new Date(); alert(d.constructor==Date);//true
我们可以通过constructor属性来确定一个位置类型是否是我们需要的:
if((typeof d=="object") && d.constructor==Date)// if((typeof d=="object") && d instanceof Date)) //都是先确定大类型:object,再判断具体类型
toString()方法和toLocaleString()方法:定义类时最好定义自己的toString方法。
hasOwnProperty(propName):用来判断对象是否有自己定义的非继承属性
isPrototypeOf():如果isPrototypeOf()方法所属的对象是参数的原型对象,那么该方法就返回true,否则返回false:
var o={}; Object.prototype.isPrototype(o);//true Function.prototype.isPrototype(Object);//true
数组:
var empty=[]; var misc=[1.1,true,"a"]; var b=[[1,{x:1,y:2}],[2,{x:3,y:4}]]; var count=[1,,3]//共三个元素:1,undefined,3 var undefs=[,,];//注意:共两个元素,都为undefined var a=new Array(10); var c=new Array(5,4,3,"testing");
注意:数组的下标必须是从0到2~32-1的整数,如果不是这个范围内的整合则转换为对应的字符串,并作为数组对象的一个属性存在,例子:
var a=[]; a[-1.23]=true; alert(a.length);//0 alert(a["-1.23"]);//true
增加数组元素:
Javascript只给真正存储了元素的数组元素分配内存空间,而且这些元素的下标还可以不是连续的:
var a = new Array(1000); a[0]=1; a[999]=999;
再看一个例子:
Circle c = new Circle(1,2,3); c[0]="this is an array element of an object!";
其实c不是数组对象,我们只不过是给对象c增加了一个属性,名为0;
删除数组元素:
delete将数组的元素设置为undefined,但是元素还存在。要真正的删除一个元素,可以使用Array.shift()、Array.pop()和Array.splice()。
截断或者增长数组:length属性不但是可读的,还是可写的。我们可以根据这一属性达到截断或增长数组的目的。
数组的方法:
[list]
var a=[1,2]; alert(a.concat(3,[4,5]));//1,2,3,4,5 alert(a.concat(4,[5,[6,7,[8,9]]]));//1,2,4,5,6,7,8,9
var a=[1,2,3,4,5]; a.slice(0,3)//1,2,3 a.slice(3);//4,5 a.slice(1,-1);//2,3,4 a.slice(-3,-2);//3
var a =[1,2,3,4,5,6,7,8]; a.splice(4);//[1,2,3,4],returns [5,6,7,8] a.splice(1,2);//[1,4],returns [2,3] a.splice(1,1);//[1],returns[4] var b = [1,2,3,4,5]; b.splice(2,0,'a','b');//b is [1,2,'a','b',3,4,5],returns [] b.splice(2,2,[1,2],3);//b is [1,2,[1,2],3,3,4,5],returns ['a','b']
哦...解放咯!玩去咯...