javascript快速入门5—数组与对象

    用代码创建数组

    1. arr[0]="数据1";//向数组中添加一个元素,数组中的元素是有编号的,并且要注意的是,编号从0开始
    2. //上面一行代码就向数组中的第一个箱添加了一个元素
    3. arr[1]="数据2";//方括号用以指定下标1
    4. arr[2]="数据3";
    5. arr[3]="数据4";
    6. arr[5]="数据6";
    7. arr[4]="数据5";
    8. alert(arr);//将会输出"数据1,数据2,数据3,数据4,数据5,数据6" 是以逗号分隔的字符串
    9. //并且这些字符串的连接是按(下标)顺序的
    10. alert(arr[0]);//当然,我们也可以直接访问其中第一个元素
    11. alert(arr[1]);//第二个
    12. alert(arr.length);//遇到的第一个数组对象的属性,length属性用以表示数组中元素的个数,输出6

    遍历数组 for 循环

    1. for (var i=0;i< arr.length;i++) {
    2. arr[i]+=" ---changed";//将数组中每个元素(字符串)后面连上一个" ---changed"
    3. }
    4. alert(arr);//变了

    创建数组的其它方式

    1. var arr;
    2. arr = new Array();//这样创建了一个空数组
    3. alert(arr);//输出为空,因为没有元素
    4. arr = new Array(3);//在申明时只放一个正整数表示数组的长度
    5. alert(arr.length);//输出3
    6. alert(arr);//输出两个逗号,它里面放了3个空元素
    7. //申明时指定了数组的长度,然后修改指定位置的值
    8. arr[2]="end";//将最后一位修改为"end"
    9. alert(arr); //并不是在数组申明时指定了长度就不能更改,更改长度很简单
    10. arr[8]="super";//数组长度将自动增长到8
    11. //记住,JavaScript中数组长度会自动增长,并且length属性会自动更新
    12. alert(arr.length);//输出9,JavaScript中数组下标是从0开始的
    13. alert(arr[8]); //也可以在创建数组时就指定值
    14. arr = new Array(1,2,3,4,5,6,7,8);
    15. alert(arr); //如果在创建数组时只指定一个值,并且是正整数
    16. arr = new Array(6);//将得不到预期效果,因为这是在声明一个长度为6的空数组
    17. //需要这样
    18. arr = new Array();
    19. arr[0]=6; //还可以使用数组字面量的方式
    20. arr = [];//是的,一个空中括号
    21. //与下面一句几乎是等价的
    22. arr = new Array(); //但更灵活和简便
    23. arr =[3];//将创建一个长度为1,第一个元素为3的数组
    24. arr = [2,3,4,6];//多个元素以逗号分隔
    25. alert(arr[0]);//输出2,下标的顺序与在中括号中出现的顺序相关
    26. //数组中可以混合存放字符串,数值,布尔值...,几乎所以类型的值,包括数组
    27. arr = new Array(1,0,true,"some string",new Array("a",3));//第五个元素放的是一个数组
    28. alert(arr[4]);//输出"a",3
    29. alert(arr[4][0]);//输出"a"

    数组的按引用传值的特性

    1. var arr = [2,3,4] ; var arr2 =arr;//这相当于给arr取了个别名
    2. arr2[0]=234;
    3. alert(arr[0]);//输出234,因为arr与arr2是同一个对象

    向数组中添加,删除元素(push,delete)

    1. var arr = [2,4];
    2. arr.push(6);//push方法将元素添加到数组未尾
    3. alert(arr.length);//输出3
    4. arr.push("a","b");//可以一次添加多个元素
    5. alert(arr.push(123));//push方法执行后会返回数组的新长度值,输出6
    6. //事实上将元素添加到数组未尾的最简单的方法是
    7. arr = [4,5];
    8. arr[arr.length]="new element";//利用数组长度自动增长的特性
    9. alert(arr.length);//输出3
    10. //为了更明了的明白push的工作原理,我们可以使用一个简单的自定义函数来完成这项工作
    11. function array_push(element,arr) {//第一个参数为要添加的元素,第二个参数为该数组
    12. arr[arr.length]=element; return arr.length;
    13. }
    14. arr = [1,2,3];
    15. array_push(345,arr);
    16. alert(arr.length);//输出4
    17. alert(array_push("some string",arr));//输出5
    18. alert(arr); //删除一个元素
    19. arr = ["#","$","%"];
    20. alert(arr); delete arr[2];
    21. alert(arr);
    22. alert(arr.length);//元素被删除了,但数组长度并没有变化,因为这样能使我们使用相同的下标访问以前的元素
    23. //使用delete与下面的语句效果一样
    24. arr = ["#","$","%"];
    25. alert(arr);
    26. arr[2]=undefined;//undefined是一个值
    27. alert(arr);

    join方法,返回数组中的所有元素以指的分隔符间隔的字符串

    1. var arr = [2,3,4];
    2. alert(arr.join("#")); //事实上当我们直接输出数组时,系统会自动调用这样的方法
    3. alert(arr);
    4. alert(arr.join(","));//两句的输出效果是一样的

    对象吗?就当和现实中的对象一样:一个"人"对象

    1. var person = new Object();
    2. person.age = 18;
    3. person.weight = "123kg";
    4. person.height = "170cm";
    5. person.arm = 2;//两个臂膀
    6. person.leg = 2;

    上面创建的对象,描述了现实中的人的一些特性:年龄 18;重量 123kg;身高 170cm;不是残疾(这个是我推断的); 其实数组也能完成这样的工作

    1. var person = new Array();
    2. person[0] = 18;
    3. person[1] = "123kg";
    4. person[2] = "170cm";
    5. person[3] = 2;
    6. person[4] = 2;

    但是这样的表达方式,没人能看出这是一个"人"对象,使用数字下标没有对象的属性明了,代码难于理解. 其实数组可以使用字符串下标的

    1. var person = new Array();
    2. person["age"] = 18;//注意,中括号里的下标是一个字符串,所以需要使用引号
    3. person["weight"] = "123kg";
    4. person["height"] = "170cm";
    5. person["arm"] = 2;
    6. person["leg"] = 2;

    我说过了,数组和对象是相通的

    1. var arr = new Array(); var obj = new Object();
    2. alert(typeof arr);//object
    3. alert(typeof obj);//object

    所以,数组用字符串下标,事实上也是在给其添加属性

    1. var arr =[1,2,3];
    2. arr["property"]="some data";
    3. alert(arr.property);//"some data"
    4. alert(arr.length);//3

    而对象也可以使用类似语法访问它的属性

    1. var obj = new Object();
    2. obj.property = "some data";
    3. alert(obj["property"]);//"some data"
    4. //当然也可以使用数字下标
    5. alert(obj[1]);//123
    6. alert(obj.property);//"some data"
    7. alert(obj.length);//但与数组不同的是,它没有length属性

    对于数组,我们可以使用for对其进行遍历,但for循环只能遍历具有数字下标的元素

    1. var arr =[1,2,3,4];
    2. arr["stringIndex"]="some data";//这个不会被遍历到
    3. alert(arr.length);//arr.length属性也不报告包含此元素
    4. for (var i=0;i< arr.length;i++) {
    5. alert(arr[i]);//i只会是数字,所以不能遍历字符串下标的元素
    6. }

    我们之前看到,对数组使用字符串下标实际上是给这个数组对象添加属性,这个时候我们会发现,对象的属性还没有什么好的方法列举出来,for.. in…循环出现了 (对于研究对象,for in循环太有用了)

    1. var obj={
    2. age:12,
    3. height:170 }; for (var i in obj) {//i将会被列举为键名,就是所说的字符串的下标
    4. alert(i+"\n"+obj[i]);/*将会以类似
    5. age
    6. 12
    7. 这样的格式分别输出它的键名键值对 */ }

    for in 循环不但是用来遍历对象属性,它也可以遍历出数组的具有数字下标的元素

    1. var arr = [1,2,3,4,5,6];
    2. arr["property"]=78;//会被遍历到,因为它是属性
    3. for (var i in arr) {
    4. alert(i+" : "+arr[i]);
    5. }

    了解这些之后,我们可以使用它们来存储一些数据:一个班的学生的成绩(该用数组还是对象呢?这确实是一个问题)

    1. //该是对象就是对象,该是数组就是数组
    2. var myClass=[];//创建一个数组,放置每个学生的信息,以学生的学号作为数组下标
    3. myClass[1]={ "name":"HUXP", "Chinese":60, "English":70, "Math":80, "Grade":"C" };
    4. myClass[2]={ "name":"发哥", "Chinese":80, "English":80, "Math":80, "Grade":"B" };
    5. myClass[3]={ "name":"Per", "Chinese":66, "English":77, "Math":88, "Grade":"B" };
    6. myClass[4]={ "name":"小虎子", "Chinese":60, "English":60, "Math":770, "Grade":"C" };
    7. myClass[5]={ "name":"DBD", "Chinese":70, "English":70, "Math":70, "Grade":"B" };
    8. myClass[6]={ "name":"○", "Chinese":77, "English":77, "Math":80, "Grade":"B" };
    9. myClass[7]={ "name":"Me", "Chinese":100, "English":100, "Math":100, "Grade":"A", "Saying":"哇哈哈!" }; //当然,做了这些还没什么意义
    10. alert(myClass[5].Chinese)//如果有学号,输出对应学号的学生的语文成绩太简单了
    11. //更复杂的,搜索学生姓名,返回他的所有信息,是使用函数的时候了
    12. function searchByName(name) { for (var i=1;i< myClass.length;i++) { if (myClass[i].name == name) { return myClass[i];
    13. }
    14. }
    15. }
    16. alert(searchByName("○").Math);

    创建String对象

    1. var str = new String();
    2. alert(str);//输出空字符串
    3. str = new String("some string here");
    4. alert(str);//输出字符串"some string here"
    5. //表面上看,这和直接创建的字符串是一样的效果
    6. str = "some string here";
    7. alert(str);

    但由于使用new String();所以创建出来的是对象

    1. var str = new String();
    2. alert(typeof str);//object
    3. //但字符串本身也存这样的方法
    • length 属性,返回字符串的长度
    • indexOf 方法,返回字符串内第一次出现子字符串的字符位置
    • lastIndexOf 方法,返回字符串中子字符串最后出现的位置
    • charCodeAt 方法,返回一个整数,代表指定位置上字符的 Unicode 编码
    • fromCharCode 方法,从一些 Unicode 字符值中返回一个字符串
    • replace 方法,进行文字替换,返回替换后的字符串的复制
    • substr 方法,返回一个从指定位置开始的指定长度的子字符串
    • substring 方法,返回位于 String 对象中指定位置的子字符串
    • toLowerCase 方法,返回一个字符串,该字符串中的字母被转换为小写字母
    • split 方法,把字符串分割为字符串数组。