这章我们来探讨js中的对象和数组。
比较难哦。做好心里准备吧。。。。。。 深呼吸。。。
1 , for / in :
一种遍历(枚举)对象属性的方法,可以循环我们呢事先不知道的属性。
它可以枚举处用户定义的所有属性,但却不能枚举出某些预定义的属性和方法。
不能枚举的属性通常是继承的属性
删除一个对象的属性:
delete book.width ;
从对象中移除了属性,在删除之后,用for/in将不会枚举该属性,并且用width in book 也检测不到该属性。
for/in 的另一个重要的用途就是跟关联数组一起使用:(如果忘记关联数组的定义,可以看前面的章节。)
for(stoct in port ){
value + = get_value(stoct) * port[stoct] ;
}
2 , 通用的Object属性和方法:
1):constructor属性:
每个对象都有这个属性,他引用了初始化这个对象的构造函数。
比如:
var d =new Date(); //使用Date()构造函数,创建一个对象 d;
d.constructor==Date; //true //属性d.constructor引用 Date ;
这个属性有助于确定一个对象的类型;
比如:
我们想确定一个值的类型是否是Date 类型:
If((typeofo==”object” )&& (o.constructor==Date)){
// 首先看是否是对象,然后看是否引用Date
}
上面的代码也可以写成:
If((typeofo==”object” )&& (o instanceof Date)){
// instanceof运算符来检测o.constructor 属性的值。
}
3 , toStirng()和toLocaleString()方法:
1):toLocaleStirng() 返回对象的一个本地化字符串。
toString和toLocaleString一般都返回相同,但在子类中,有点区别:
比如:
Array , Date和Number都定义了返回本地化的值的toLocaleString()方法.
4 , hasOwnProperty()和propertyIsEnumerable()方法:
1):hasOwnProperty
var a = { x : 1 , y : 2};
var k =a.hasOwnProperty("x");
alert(k) //true
alert( Math.hasOwnProperty("z") );//false
alert( Math.hasOwnProperty("cos") );//true
注:Math,cos() : 以弧度为单位计算并返回指定角度的余弦值。
propertyIsEnumerable()跟返回的结果跟hasOwnProperty()相同;
4 ,isPrototypeOf()方法:
如果方法所属的对象是参数的原型对象。
var a = { x : 1 , y : 2};
var k1= Object.prototype.isPrototypeOf(a); // o.constructor = Object
var k2= Object.prototype.isPrototypeOf(Function); // Function.constructor= Object
alert(k1) //true
alert(k2) //true
5,数组:
1)创建数组:
数组直接量:
var es =[ ] ;
复杂点 var es = [ [ 1, {x:1 , y : 2}] , [ 2, {x:3 , y : 4}] ];
还有一种方式:使用Array() 构造函数:
V1 : 无参数:
var a =new Array();
空数组,和 var a =[ ] 相等 ;
V2: 多个参数:
var a= new Array( 1,2,3,”tt”) ; //可以看出直接量定义简单些。
V3: 1个数字参数:
var a = new Array (3);
具有3个元素的数组,每个元素的值为 undefined ;
6, 数组的下标(索引):
大小 : 0 <= 下标 < 2的32次方– 1 ;
如果不在范围内,js会讲它转换为一个字符串,作为对象属性的名称;
而不是作为数组的下标;
比如:
a[-1.2] = “test” ; // 等价于 a[“-1.2”] =”test” ;
//代码解释: 创建一个名为 “-1.2”的属性,而不是定义一个 新的数组元素。
7, 添加数组的内存使用:
a[10] = “test” ; //添加新的元素
内存的使用:
比如:
a[0] = “1” ;
a[10] =”10” ;
那么js值给下标为0 和10的元素分配内存,中间的9个元素不被分配;
注:数组也可以添加到对象中;
比如;
var a =new Circle(1,2,3);
a[0]= “test”;
这个例子定义了一个名为” 0 “的新对象属性。
只将数组元素添加到一个对象中并不会使它成为数组。
8, 删除数组:
var a = [1,2];
delete a[0];
alert(a[0]) //输出 undefined
alert(a[1]) //输出 2
由例子可以看出,delete删除其实没有真正删除,只不过把元素设置为undefined;
如果要真正删除,可以使用Array.shift(),等方法。
比如:
var a =[1,2];
delete a[0];
alert(a[0]) //输出 undefined
alert(a[1]) //输出 2
a.shift(); //删除数组的第一个元素
alert(a[0]) //输出 2
alert("length:"+a.length);
alert(a[1]) //输出 undefined ; 1已经被删除了,其实数组已经的长度只有 1 了;
9,数组的length:
a[49] = “a”;
// 那么这个数组的长度是 50 ;
length属性经常用于遍历数组元素;
比如:
var a = [“a” , “b “ ,”c” ];
for(var i= 0 ; i< a.length ; i++){
alert(a[i]);
}
这个是在假定元素是连续的,如果不是这种情况:
必须检测每个元素是否被定义 :比如:
for(vari = 0 ; i< a.length ; i++){
if(a[i]){
alert(a[i]);
}
}
多维数组: a[i][j] ;
10,数组的一些方法:
1):join() 方法:
把一个数组的所有元素都转换成字符串。
比如:var a =[1,2,3];
var s = a.join(); // 输出 s==1,2,3
当然也可以 指定一个分隔符;
比如;
s = a.join(“,”);
这个方法跟String.split()相反, split()将一个字符串分割成几个片段来创建数组;
2):reverse () 方法:
把一个数组颠倒。
var a = new Array(1,2,3);
a.reverse();
var s = a.join(); //s == “3,2,1”
3):sort() 方法:
排序
♂:如果不给传参数,那么按照字母顺序对数组元素排序。
var a =new Array(“ee”,”df”,”b”);
a.sort()
var s = a.join(“, ”); // s == “b, df, ee”
♂:如果传参数:
比如:
var a = [33,4,1111,222]
a.sort(); // 排序 : 1111 ,222 ,33,4
a.sort(function(x,y){
return x-y;
});
var s = a.join(); //输出 4, 33,222,1111
//可以从例子看出,排序如果x > y ,那么第一个参数就排在第2个参数后,
比如; 1111 ,222 -à 1111-222>0 -à则 222 , 1111
另外注意下字母排序:因为js是区分大小写,所以排序的时候,把字符统一成大写或者小写,再排序。
4):concat() 方法:
var a =[1,2,3];
a= a.concat(4, [5,6],7);
a=a.join(); //输出 1,2,3,4,5,6,7
alert(a)
注意:
如果是数组里面还有数组 ,就不能展开了。
比如:
var a = [1,2,3];
a = a.concat(4,[5,[6,6]],7);
alert(a); //这个看不出来
a = a.join("|");
alert(a); //分割后,注意有个逗号
-------------------------------------
var c = [1,2,3];
var d =new Array(1,2,3);
alert(c); //1,2,3
alert(d); //1,2,3
//之所以不输出Object ,是因为
//数组是一个具有额外功能层的对象.
//我们记住他的特殊性。
5):slice() 方法:
返回数组某一个片段。跟字符串的substring方法类似。
6):splice() 方法:
首先他跟 slice 方法 只有一个字母的差别,不过用处完全不同。
他可以用来删除。
var a = [1,2,3];
a = a.splice(0,2);
alert(a); // 输出 1, 2
a = a.splice(1,2);
alert(a); // 输出 2 。如果是 a = a.splice(0 , 1) ; 输出 1
a = a.splice(1,2);
alert(a); // 没有删除任何数组,输出空数组
他也可以插入数组。具体方法:
var array1 = newArray("1","2","3","4");
array1.splice(1,0,"5");//在第2个元素后面,插入 5 ;如果第2个参数为0,则不删除。
document.write(array1+"<br>"); //输出 1, 5,2 ,3,4
array1.splice(2,3,"7","8") // 删除第3个的元素后的 3个元素。也就是第3个,第4个,第5个元素。然后在这个位置上插入7,8
document.write(array1);//输出 1, 5,7,8
注意:和concat()不同,splice并不将他插入的参数展开。也就是如果插入一个数组,他就是插入数组本身,还不是数组的元素。
而concat()插入数组的话,就会把数组展开,插入数组中的元素,不过当插入的数组里
还有数组的时候,就不会展开了。
7):push() 方法和pop()方法:
push(): 将一个或者多个数组 附加到数组的尾部。
pop() : 删除数组的最后一个元素。
var array1 = newArray("1","2","3","4");
array1.push("5");
document.write(array1+"<br>"); //输出 1, 2,3 ,4,5
array1.pop()
document.write(array1);//输出 1, 2,3 ,4
8):unshift() 方法和shift ()方法:
跟push和pop唱反调。。。
unshift (): 将一个或者多个数组 附加到数组的头部。
shift ():删除数组的第一个元素。