十五、数组基础、数组方法、数组排序
一 、数组基础
1.1 声明数组的三种方式
推荐(都用)数组字面量的形式创建数组
var arr1 = []; //数组字面量
// 系统内置的Array构造函数声明数组
var arr2 = new Array(); //不推荐
var arr3 = Array(); //不使用
所有的数组(不论哪种声明方式)都继承
Array.prototype
,其下的方法和属性都可以被继承使用。
声明对象的三种方式:(类比一下数组)
推荐使用对象字面的形式创建对象
var obj1 = {};//对象字面量
// 系统内置的 Object 构造函数声明对象
var obj2 = new Object();
var obj3 = Object();
所有的对象都继承
Object.prototype
,其下的方法和属性都可以被继承使用。
1.2 数组是一个特殊的对象
1.2.1
数组为什么是一个特殊的对象:
它和对象一样也是一个键名对应一个键值
,我们把数组中键名叫做数组元素的下标;
同时数组也是对象的一种有序体现
。
var arr = [1,2,3,4,5];
// 模仿数组声明一个对象
var obj = {
0: 1,
1: 2,
2: 3,
3: 4,
4: 5
}
// 打印3
console.log(arr[2]); //3
console.log(obj[2]); //3
1.2.2
什么是数组下标:
数组中每一个元素对应有一个位置,这个位置就是我们所说的下标,或者叫index索引。
1.2.3
为什么打印 数组[length]是
undefined
呢?
undefined
var arr = [1, 2, 3, 4, 5];
console.log(arr[5]); //undefined
因为数组相当于一个特殊的对象,访问对象不存在的属性时,返回
undefined
;访问数组[length]时,数组中并没有这个元素,所以也返回
undefined
。
var obj = {
0: 1,
1: 2,
2: 3,
3: 4,
4: 5
}
console.log(obj[5]);//undefined
1.2.4 数组和对象一样可以进行增改查
var arr = [1,2,3,4,5];
arr[6] = 7; //增
arr[0] = 10; // 改
console.log(arr[0], arr); //查
留一下删?
1.2.5
new Array()
创建数组
new Array()
稀松数组:数组中有空值。
-
使用内置构造函数声明数组时,数组中不能有空值
;
数组中最后一个逗号后面的空值会被忽略。
var arr1 = new Array( 2, 3, 7, );
-
传一个数字参数x,构造出一个长度为x的数组;这个数组有元素,只是每个元素是空,叫empty [,]。
var arr2 = new Array(5);
-
如果传一个小数的话,报错信息:Invalid array length。
var arr3 = new Array(5.2);
-
传入一个字符串,把这个字符串当做元素放到数组中。
var arr4 = new Array('a');
二、※ 数组方法
数组的专用方法都是从
Array.prototype
继承而来。
有些方法是来自Array的静态方法,比如:
Array.isArray()
用于确定传递的值是否是一个
Array
。
这里记录修改原数组的
7
个方法:
push 和 unshif
pop 和 shift
reverse
splice
sort
2.1 ※push和unshift
功能:
- push()在数组末位添加元素
- unshift()在数组首位添加元素
返回值:
执行方法以后的数组长度。
参数:
可以传多个或一个:
push(5,6,7) unshift(1)
var arr = [2,3,4];
console.log(arr.push(5,6,7),arr);
console.log(arr.unshift(1),arr);
自己实现push方法:
var height = [180, 177];
// 自己实现push方法
Array.prototype.myPush = function(){
for(var i = 0; i < arguments.length; i++){
this[this.length] = arguments[i];
//谁调用它,this指向谁,这样所有数组都可以使用这个函数
}
return this.length; //返回执行后的数组长度
}
console.log(height.myPush(178, 180), height);
return 还是返回执行方法以后数组的长度。
2.2 ※pop和shift
功能:
- pop()剪切数组最后一位元素
- shift()剪切数组第一位元素
返回值:
被剪切的一位元素。
参数:
无
var arr = ['a', 'b', 'c', 'd'];
console.log(arr.pop(), arr);
console.log(arr.shift(), arr);
var height = [180, 177];
var h = height.pop();
console.log(h);
可以用一个变量去接收一个被剪切的元素。
2.3 ※splice
2.3.1 splice的基本使用
功能:
- 删除(剪切)数组指定相邻元素;
- 替换元素(删除的同时在删除的位置上增加元素);
- 只增加元素;
返回值:
被剪切元素组成的数组。
参数:
2+n个
前两个参数的含义是:开始项的下标;剪切长度。
之后的参数代表插入的元素。
-
删除数组中的指定相邻元素(只传入2个参数):
var arr = ['a', 'b', 'c', 'd']; console.log(arr.splice(0, 2), arr);
-
替换元素(传入2+n个参数)
var arr = ['a', 'b', 'c', 'd']; console.log(arr.splice(1,2,'white','rose'), arr);
-
只增加元素(传入2+n个参数):
var arr = ['a', 'b', 'c', 'd']; console.log(arr.splice(3,0,'pig','dog'), arr);
总结:无论是删除/插入都可以看做,从开始项下标的元素与前一个元素之间开始计算剪切长度,之后改变数组。
2.3.2 splice怎么判断元素的位置
splice的首位参数可以传负值
var arr = ['a', 'b', 'c', 'd'];
console.log(arr.splice(-1, 1),arr);
而数组访问元素时,下标从0开始为0,1,2…都为正值;
splice中开始项下标的取正负的逻辑处理过程:
var arr = ['a', 'b', 'c', 'd'];
function splice(arr, index){
return index > 0 ? index
: index + arr.length;
}
console.log(arr[splice(arr, -1)]); // 'd'
console.log(arr[splice(arr, -2)]); // 'c'
2.4 reverse
功能:
使数组倒序。
返回值:
被倒序的数组。
参数:
无
var arr = [2,3,4,5,6];
console.log(arr.reverse(), arr);
三、数组排序
3.1 sort
3.1.1 基本用法
功能:按照ASCII码升序排序。
返回值:
排序以后的数组。
参数:
无
var arr = [8, 7, 9, 5, 1, 2];
var arr2 = ['b', 'z', 'a', 'h', 'j'];
var arr1 = [27, 49, 5, 7];
console.log(arr.sort(),arr);
console.log(arr2.sort(),arr2);
console.log(arr1.sort(),arr1);
sort排序时,把数字变成字符串,按照ASCII码升序排列,从前往后一个字符一个字符的一 一 比较,前面的字符比较有结果,则不再比较后面的字符。
※3.1.2 自定义数组排序方法
返回值:
- 负值,a排在前面
- 正值,b排在前面
- 0,保持不动
参数:
两个参数a,b;必须有。
a代表数组中前一个元素,b代表数组中后一个元素。
比较方式:循环比较相邻的两个值,达到冒泡排序的效果。
升序排序形式:
var arr = [27, 49, 5, 7];
arr.sort(function(a, b){
if(a > b){
return 1;
}else {
return -1;
}
});
console.log(arr);
也可以简写成:
var arr1 = [27, 49, 5, 7];
arr1.sort(function(a, b){
return a - b;
});
console.log(arr1);
如果a>b,则return的a-b>0,即return一个正值。
b就排在前面,即小值排在前面,数组升序。
只要逻辑保持一致,排序后的数组是一样的。
注:
公司注重代码的可读性,并不是代码写的越少越好
。
3.1.2 随机排序
使用自定义数组的形式。
使用方法:
Math.random()
,随机返回一个(0,1)开区间的数字。
arr.sort(function(a, b) {
if(Math.random() > 0.5){
return 1;
}else {
return -1;
}
})
//简写形式
arr.sort(function(a, b) {
return Math.random() - 0.5;
})
console.log(arr);
如果
Math.random()
大于0.5,就把这个值往后放,sort的自定义函数就return 正值。
※ 3.1.3 按照数组中对象的某个属性排序
按照数组中对象的num属性升序排列:
var friends = [
{
name: 'rose',
num: 25
},
{
name: 'jordan',
num: 45
},
{
name: 'kobe',
num: 41
},
];
// 按照数组中对象的num属性升序排列
friends.sort(function(a, b) {
if(a.num > b.num){
return 1;
}else{
return -1;
}
});
console.log(friends);
3.1.4 按照数组中元素字符串长度排序
按照数组中元素字符串长度升序排序:
var arr = ['12345,', '1', '123', '14', '1,'];
arr.sort(function heihei(a, b ) {
if(a.length > b.length){
return 1;
}else{
return -1;
}
});
console.log(arr);