1. 数组基础
1.1声明数组的三种方式
var arr1 = [];//数组字面量var arr2 = new Array();//通过系统内置的Array构造函数声明数组,不推荐使用var arr3 = Array();//第三种(不使用的),打印出来也是数组
这三种方式构造出来的数组的原型都是Array,所有数组都继承于Array.prototype。
声明对象的三种方式
var obj1 = {};//对象字面量var obj2 = new Object();通过系统内置的Object构造函数声明数组var obj3 = Object();//第三种(不使用的)
例如
var arr4 = [1, 2, 3, 4, 5];var obj4 = {0: 1,1: 2,2: 3,3: 4,4: 5}//对象的键名是数组的下标,键值是数组的元素
var obj5 = {name: 'a'}
此对象的访问是obj5.name,机制其实就是js底层做了处理obj5[‘name’],在javascript当中,数组就是对象另外一种形式,只是写法不同,但是访问机制是一样的。
1.2例
var arr5 = [,,];console.log(arr5);//(2) [empty × 2]console.log(arr5.length);//2var arr6 = [ , 1, 3, 5, 7, ];console.log(arr6);//(5) [empty, 1, 3, 5, 7],最后一个值打印不出来,其实是数组最后一个值打逗号,但还是不算的,系统内置有截取的机制,就相当于var arr6 = [ , 1, 3, 5, 7];console.log(arr6.length);//5var arr7 = [ , 1, 3,,,5, 7];//这种数组叫稀松数组var arr8 = new Array[ ,1, 2, 3, 4, ];//报错,语法错误,用系统内置的构造函数中间不能有空值var arr9 = new Array(5);//[empty × 5],如果只填一个number值,那就是这个数组的长度,相当于[,,,,,],这并不是空数组,数组的有元素的,只是每个元素都是空var arr10 = new Array(5.2);//Invalid array length报错,非法的数组长度var arr11 = new Array(a);//报错,a is not definedvar arr12 = new Array('a');//['a']
var arr13 = [1, 2, 3, 4];console.log(arr13[4]);//undefined//为什么返回undefined,举例var obj6 = {0: 1,1: 2,2: 3,3: 4}console.log(obj6[4]);//undefined,因为找不到第五位
2. 数组方法
2.1 push unshift
- 数组的这些方法都是继承了Array这个构造函数上的属性prototype而来的.
- push是在数组的最后一位添加元素,unshift是在数组的第一位前面添加元素,都可以加多个值。返回值都是是执行了方法以后数组新的长度
模拟push方法:
Array.prototype.myPush = function(){for(var i = 0; i < arguments.length; i++){this[this.length] = arguments[i];}return this.length;//返回值是数组长度}
2.2 pop shift
pop每次会把数组最后一位剪切掉,返回值是剪切的值,该方法没有参数。
shift每次会把数组第一位剪切掉,返回值是剪切的值,该方法没有参数。var arr15 = ['a', 'b', 'c'];var str = arr15.shift();console.log(str);//'a',可以用变量去接返回值
2.3 reverse
把数组倒序var arr16 = ['a', 'b', 'c'];arr16.reverse();console.log(arr16)//'c', 'b', 'a'
2.4 splice
arr.splice(开始项的下标(也可以填负值,从最后一位开始算,从-1开始),
剪切长度,
剪切以后最后一位开始添加数据) ```javascript var arr17 = [‘a’, ‘b’, ‘c’]; arr17.splice(1, 1, 1, 2 ,3); console.log(arr17);//[‘a’, 1, 2, 3, ‘c’]
var arr18 = [‘a’, ‘b’, ‘c’, ‘e’]; //arr18.splice(3, 0, ‘d’);//[‘a’, ‘b’, ‘c’, ‘d’, ‘e’]第二个参数写0,直接添加 arr18.splice(-1, 0, ‘d’);//效果同上
splice这个方法怎么实现的?关于负值位置的判断是如何计算的?模拟splice方法的函数```javascriptfunction splice(arr, index){return index += index >= 0 ? 0 : arr.length;}
2.5 sort
var arr19 = [-1, -5, 8, 0, 2];arr19.sort();console.log(arr19);//[-1, -5, 0, 2, 8]打印结果按照升序来排var arr20 = ['b', 'z', 'h', 'i', 'a'];arr20.sort();console.log(arr20);//['a', 'b', 'h', 'i', 'z']打印结果也是按升序排
var arr21 = [27, 49, 5, 7];// 27 49// 5 27// 7 27// 5 49// 7 49// 5 7 冒泡排序法,把每一位和前后一位进行比对arr21.sort();console.log(arr21);//[27, 49, 5, 7],ascii码来排,只比对了第一位
sort函数返回的值是排序以后的数组,排序是按照ascii码来排的
1.必须有两个参数,例a,b
2.必须设定返回值: 1负值,a就排前面
2.正值,b就排前面
3. 0 保持不动
arr21.sort(function(a, b){if(a > b){return 1;}else{return -1;}//最终简化写成 return a - b,如果是降序就写成b - a});console.log(arr21);//[5, 7, 27, 49]
例,sort方法随机排序
Math.random(),随机数,返回0 ~ 1,开区间不包含0和1
var arr22 = [1, 2, 3, 4, 5, 6];arr22.sort(function(a, b){var rand = Math.random();if(rand - 0.5 > 0){return 1;}else{return -1;}//return Math.random() - 0.5;或者把条件语句直接写成这句});console.log(arr22);
例,按照数组内的参数进行年龄大小的升序来排序
var arr23 = [{son: 'Jenny',age: 18},{son: 'Jone',age: 10},{son: 'Ben',age: 16},{son: ' Crytal',age: 3},{son: 'Lucy',age: 11}];arr23.sort(function(a, b){if(a.age > b.age){return 1;}else{return -1;}//return a.age - b.age;或者可以写成这样});console.log(arr23);//打印的数组是按照age数字升序来排列数组
例,对比数组长度
var arr24 = ['12345', '1', '1234', '12', '1234567'];arr24.sort(function(a, b){if(a.length > b.length){return 1;}else{return -1;}//return a.length - b.length;或者可以写成这样});console.log(arr24);
总结
修改原数组的方法 :push/unshift pop/shift reverse splice sort
