Javascript入门学习第四篇 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((typeof o==”object” )&& (o.constructor==Date)){

  //  首先看是否是对象,然后看是否引用Date

  }

  上面的代码也可以写成:

  If((typeof o==”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(var i = 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 = new Array("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 = new Array("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 ():删除数组的第一个元素。

  数组的一些方法是比较多,看起来也比较烦。所以大家应该有点耐心。

  另外可以参考这篇文章;

  http://www.cssrain.cn/article.asp?id=438

  总结:这章主要讲了对象和数组的一些方法。比较难记和难理解。不过任何事情都是从难到容易的过程。一次没看懂,再看一次。。。书读百遍,其意自现。。。。。。

  也许你不需要读一百遍呢.   ^_^。

  是不是感觉看了这么多js概念,已经迫不及待的想自己写点例子什么的。好吧。

  下章我们 来点实战的。。。。

  如果还有不懂,可以google 搜索资料. (