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);//2
var arr6 = [ , 1, 3, 5, 7, ];
console.log(arr6);
//(5) [empty, 1, 3, 5, 7],最后一个值打印不出来,其实是数组最后一个值打逗号,但还是不算的,系统内置有截取的机制,就相当于var arr6 = [ , 1, 3, 5, 7];
console.log(arr6.length);//5
var 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 defined
var 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方法的函数
```javascript
function 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