引用类型:是一种数据结构,用于将数据和功能组织在一起。
5.1 Object——对象类型!
创建Object实例,第一种方法:使用new操作符后跟Object构造函数
1 1 var person = new Object(); 2 2 person.name = "张三";3 person.age = "30";
第二种方法:字面量表示方法
var person = { name = "张三", age = 3 }; //注意:属性名也可以使用字符串 :"name" = "张三";
5.2 数组 Array 类型
ECMAScript 数组的每一项可以保存任何类型的数据,且数组的大小是可以动态调整的。
创建数组:
//第一种方法 var arr = new Array(); // 创建一个数组 arr var colors = new Array(10);//创建一个长度为10 的数组 var num = new Array(1,2,3);//创建一个有三个项的 数组[1,2,3] //第二种方法 数组字面量表示 var colors = ["red","blue","green"]; var food = []; //一个空数组 var sum =[1,2,]; //最好不这样创建,会创建一个包含2或3项的数组,ie8及以下中算3项。
在读取和设置数组的值时,要使用方括号并提供相应的值基于0的数字索引,数组的项数保存在其length属性中!
var num = [3,4,12,35,68,1]; alert(num[1]); // 显示第二项 alert(num[0]); // 显示第一项 alert(num.length);// 6
5.2.1 检测数组
var value = [1,2,3] //ECMAScript3 规定,此方法假定直只有一个全局执行环境! if (value instanceof Array){ //对数组执行某些操作 } //ECMAScript 5 新增 Array.isArray()方法 if(Array.isArray(value)){ // 对数组执行某些操作 }
5.2.2 转换方法
所有对象都具有toLocalString(),toString(),valueOf()方法,其中调用数组的toString()方法返回数组中每个值得字符串形式拼接而成的一个以逗号分割的字符串。而valueOf()返回的还是数组。其中:alert()要接收字符串参数,所以会在后台调用toString()方法!!
var colors = ["red","blue","green"]; alert(colors.toString()); // red,blue,green alert(colors.valueOf()); // red,blue,green alert(colors); // red,blue,green
数组继承的toLocaleString()、toString()和valueOf()方法,在默认情况下都会以逗号分隔的字符串的形式返回数组!
join()方法重现了toString()方法的输出。如:
var colors = ["red","green","blue"]; alert(colors.join(",")); //输出 red,blue,green alert(colors.join("||")); //输出 red||blue||green
5.2.3 数组方法
- push()方法可以接收任意数量的参数,把他们逐个添加到数组的末尾,并返回修改后数组的长度!
- pop()方法从数组的末尾移除最后一项,减少数组的length值,并返回被移除的项!
var num =[3,4,5,1,2]; var count = num.push(5,7,8,10); //接收 push方法后返回的数组的长度 alert(count); // 9 var remove = num.pop(); //接收pop方法返回的被移除的项 alert(remove); // 10
- shift()方法从数组的顶端移除项,并返回该项!
- unshift()方法从数组的顶端添加任意个项并返回数组的长度!
var num = [1,2,3]; var count = num.unshift(0); alert(count); var remove = num.shift(); alert(remove);
- reverse()方法会反转数组项的顺序
1 var values = [1,2,3,4,5]; 2 3 values.reverse(); //反转数组排序 4 5 alert(values);
- sort()方法按升序排序数组项——即最小值位于最前面,最大的值排在最后面。(按字符串记性对比)!
var sum = [0,1,5,10,15]; //sort()方法会调用每个数组项的toString()转型方法,然后比较得道的字符串 sum.sort(); alert(num); // 0,1,10,15,5
sort()接收一个比较函数作为参数。比较函数接收两个参数,如果一个参数应该位于第二个之前,则返回一个负数,如果相等返回 0 ,如果第一个参数应该位于第二个之后则返回一个正数!
function compare(value1, value2) { if (value1 < value2) { return 1; } else if (value1 > value2) { return -1; } else { return 0; } } var values = [0, 1, 5, 10, 15]; values.sort(compare); alert(values); // 15,10,5,1,0 //更简单的方法 var num = [0, 1, 5, 10, 15];num.sort(function(a,b){ return a-b;});alert(num);
- sort()方法按升序排序数组项——即最小值位于最前面,最大的值排在最后面。(按字符串记性对比)!
- concat()方法可以基于当前数组中的所有项创建一个新的数组,具体来说,这个方法会创建当前数组的一个副本,然后将接收到的参数添加到这个副本的末尾!
//两个数组合并成一个新的数组 var alpha = [a,b,c]; var numeric = [1,2,3]; var alphaNumeric = alpha.concat(numeric);//a,b,c,1,2,3 //三个数组和非数组值合并成一个新数组 var num1 = [1,2]; var num2 = [3,4]; var num3 = [5,6]; var nums = num1.concat(num2,num3,7); alert(nums);
- splice()方法算是最强大的数组方法了,主要用途是向数组的中部插入项,有下列三种方,
1、删除:可以删除任意项,只需指定 2 个参数:要删除的第一项的位置和 要删除的项数
例如splice(0,2)会删除数组中的前两项
2、插入:可以向指定位置插入任意数量的项。只需提供3个参数:起始位置、0(既要删除的项 数)和要插入的项,如果要插入多个项,可以再传入第四、第五个以至任意多个项,如 splice(2,0,"red","green")会从当前数组的位置2开始插入字符串“red”和“green”!
3、替换:可以向指定位置插入任意数量的项同时删除任意数量的项!三个参数 :起始位置,要 删除的项数和要插入的任意数量的项,如splice (2,1,"red","green")会删除当前数组位置2 的项,然后再从位置2 开始插入字符串“red”和“green”。
splice的返回值由被删除的元素组成的一个数组。如果只删除了一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组。var num = [1,2,3,4,,5,6,7];
var removed = num.splice(2,1,8,9,10);//从起始位置为2开始 删除 1 项,并添加8,9,10项
console.log(num); // [1, 2, 8, 9, 10, 4, 7: 5, 8: 6, 9: 7]
console.log(removed); //[3]
- indexOf()和lastIndexOf()是ECMA 5 中添加的两个位置方法,这两个方法都接收两个参数:要查找的项和表示查找的起点位置的索引。indexOf()从数组头开始向后查找,lastIndexOf()从数组末尾开始向前查找!且必须严格相等!
返回值:返回要查找的项在数组中的位置,或者没找到的情况下返回 - 1;var numbers = [1,2,3,4,5,4,3,2,1]; console.log(numbers.indexOf(4)); // 3 console.log(numbers.lastIndexOf(4)); // 5 console.log(numbers.indexOf(4,4)); // 5 console.log(numbers.lastIndexOf(4,4)); // 3 console.log(numbers.indexOf(6)); // -1
- every():对数组中的每一项裕兴给定函数,如果该函数对每一项都返回true,则返回true。不会改变原数组。
var passed = [12,5,8,44,130]; console.log(passed.every(function(item,index,array){ return item>10; })); //false var passed = [12,5,8,44,130]; console.log(passed.every(function(item){ return item>3; })); //true
- filter() :对数组中的每一项运行给定函数,返回该函数会返回true的项组成的数组。
var numbers = [1,2,3,4,5,4,3,2,1]; var result = numbers.filter(function(item){ return item > 3; }); console.log(result); //[4, 5, 4]
- forEach():对数组中的每一项运行给定函数。没有返回值
function logArrayElements(element,index,array){ console.log("a["+index+"]="+element); } [2,3,45,56].forEach(logArrayElements); //a[0]=2 // a[1]=3 //a[2]=45 //a[3]=56
- mab():对数组中每一项运行给定函数,返回每次调用的结果组成的数组。
var numbers = [1,2,3,4,5,4,3,2,1]; var mapResult = numbers.map(function(item, index, array){ return item * 2; }); alert(mapResult); //[2,4,6,8,10,8,6,4,2]
- some():对数组中的每一项运行给定函数,如果该函数对任意一项返回true,则返回true.
function isBigEnough(element, index, array) { return (element >= 10); } var passed = [2, 5, 8, 1, 4].some(isBigEnough); // passed is false passed = [12, 5, 8, 1, 4].some(isBigEnough); // passed is true
- reduce()和reduceRight(),归并数组的方法,都会迭代数组的所有项,然后构建一个最终返回值。reduce()从数组第一项开始,reduceRight()从数组的最后一项开始,遍历每一项!
接收两个参数:一个在每一项上调用的函数和(可选的)作为归并基础的初始值。
函数接收四个参数:前一个值、当前值、项的索引和数组的对象!这个函数返回的任何值都会作为第一个参数自动传给下一项。第一次迭代发上在数组的第二项上,因此第一个参数事数组的第一项,第二个参数是数组的第二项!var values = [1,2,3,4,5]; var sum = values.reduce(function(prev,cur,index,array){ return prev+cur; },10); console.log(sum); //25
注意:这些方法中,every()、filter()、forEach() 、map()、 some()这几个方法都属于迭代方法每个方法都接收两个参数:要在每一项上运行的函数和(可选的)运行该函数的作用域对象——影响this 的值。传入这些方法中的函数会接收三个参数:数组项的值、该项在数组中的位置和数组对象本身!
另外还有 ECMAScript 2015(ES6)规范的一些方法,会在学习之后添加上!