array数据类型的详细解读
数组是对象数据类型,只不过是对象数据类型中的一个细分类而已
console.log(typeof [1, 2, 3]); -->"object"
定义一个数组有两种方式
字面量方式
var ary = [45, 56, 67];
实例创建
var ary = new Array();
console.dir(ary);
数组也是有属性名和属性值组成的,只是我们不用写属性名即可,默认属性名是数字,代表当前是数组中的第几个值-->索引
0代表第一个值 ary[0]
ary[索引] 获取数组中对应的值
ary.length 存储的值是当前数组的个数
一般我们都是是用for循环来遍历数组中的每一项,进行相关的操作
for (var i = 0; i < ary.length; i++) {
var cur = ary[i];//每一次循环获取当前数组中的那一项
}
var ary = [12, 23];
增加第三项-->往末尾增加一项
ary[2] = 34;
添加前最后一项的索引是ary.length-1,我们在它的后面添加一项,索引是ary.length
ary[ary.length] = 34;
删除第四项 -->删除数组最后一项
delete ary[3];
delete ary[ary.length - 1];
数组中的length属性是可以修改值的
ary.length = ary.length - 1; 或者
ary.length -= 1;
console.log(ary);
数组常用的方法(记住这些方法的四个维度):
1、方法的作用
2、方法的参数
3、方法的返回值
4、原有的数组是否发生了改变
var ary = [12, 23, 56, 67, 78, 89, 91, 13];
一、数组的增加、删除、修改
1、push() 向数组的末尾增加新的元素 参数:要增加的内容(可以是多个值) 返回值:增加内容后数组的长度值 原有数组改变了
var res = ary.push(78, 100);
console.log(res);
console.log(ary);
2、pop() 删除数组最后一个元素 返回值:删除的那个元素 原有数组改变
var res = ary.pop();
console.log(res);
console.log(ary);
3、shift() 删除数组的第一个元素 返回值:删除的那个元素 原有数组改变
var res = ary.shift();
console.log(res);
console.log(ary);
4、unshift() 向数组的开头增加新的元素 参数:要增加的内容(可以是多个值) 返回值:增加内容后数组的长度值 原有数组改变了
var res = ary.unshift(100, 200);
console.log(res);
console.log(ary);
5、splice(n,m) 从索引n开始删除m个元素 返回值:把删除的内容当做一个新的数组返回 原有的数组改变了
splice(n) 从索引n开始删除到数组的末尾 --> splice(0) 全删,清空数组 --> splice() 一个都不删除
var res = ary.splice(2, 4);
console.log(res);
console.log(ary);
splice(n,m,x) 从索引n开始,删除m个元素,用x把这个位置填补上 返回值:把删除的内容当做一个新的数组返回 原有的数组改变了
var res = ary.splice(2, 2, "珠峰培训");
console.log(res);
console.log(ary);
splice(n,0,x) 从索引n开始,一个都不删除,把x添加到索引n的前面 原有的数组改变了
var res = ary.splice(3, 0, "珠峰培训");
console.log(res);
console.log(ary);
二、数组的查询
var ary = [12, 23, 56, 67, 78, 89, 91, 13];
1、slice(n,m) 从索引n开始,找到索引m处(不包含m这一项),把找到的内容当做一个新的数组返回,原有的数组不变
slice(n) 从索引n开始找到数组末尾 --> slice(0) 复制一份和原来一模一样的数组(数组的克隆) <--> slice()
var res = ary.slice();
console.log(res);
console.log(ary);
2、concat() 实现数组的克隆 原有的数组也是不进行改变的
var res = ary.concat();
console.log(res);
console.log(ary);
concat()本身并不是为了实现数组的克隆,而是实现两个数组的拼接的
var a = [1, 2, 3];
var b = [2, 3, 4];
var res = a.concat(b);//a数组拼接了b数组,最终合并成一个数组
console.log(res);
三、数组转为字符串
1、join
2、toString
一些常用的但不兼容的方法
1、indexOf 不兼容 --> lastIndexOf
2、forEach 不兼容
3、map 不兼容
四、操作数组的顺序
var ary = [12, 23, 56, 7, 78, 89, 91, 13];
1、reverse() 将数组倒过来排列 原有的数组改变
var res = ary.reverse();
console.log(res);
console.log(ary);
2、sort() 实现数组的排序 原有的数组改变 但是默认情况下只能处理10以内的数字,超过10按照第一个字母排序
传递一个参数可实现高级的排序 参数是一个函数,有两个形参a,b,return a-b是升序,return b-a是降序
ary.sort(function (a, b) {
return b - a;
});
console.log(ary);
数组中冒泡排序思想
var ary = [12, 8, 14, 9, 1];
ary.sort(function (a, b) {
console.log(a, b);
});
console.log(ary);
里面的函数执行了4次
12 8
8 14
14 9
9 1
a是每一次的当前项,b是后一项 return a-b; 返回当前项和后一项的差值--> 大于0 小于等于0
冒泡排序的算法
思想:当前项和后一项进行比较,如果当前想大于后一项,两者交换位置
var ary = [12, 8, 14, 9, 1]; ---> [1,8,9,12,14]
第一轮比较:
[8,12,14,9,1]
[8,12,14,9,1]
[8,12,9,14,1]
[8,12,9,1,14]
第一轮两两比较完成后,并没有达到我们的目标值,但是把数组中当前最大的值14 放在了数组的最末尾的位置
第二轮比较:
[8,12,9,1,14]
[8,9,12,1,14]
[8,9,1,12,14]
第三轮比较:
[8,9,1,12,14]
[8,1,9,12,14]
第四轮比较:
[1,8,9,12,14]
每一轮前后比较完成后,都会把当前最大的那个数值,放在数组的末尾的位置;那么一个数组有5项,我最多只需要把四个最大值分别放在末尾就实现了排序;--->我最多比较 ary.length-1 轮
每一轮比较的次数也有规律:
第一轮 4次 --> 不用和自己比,所以最多比较4次,并且在这个轮比较前,还没有往后面放最大的数
第二轮 3次 数组末尾放了一个最大的值 ---> 不用和自己比,最多4次,也不用和末尾的那一个比,只剩3次了
第三轮 2次 数组末尾放了两个最大的值 ---> 不用和自己比,最多4次,也不用和末尾的那两个比,只剩2次了
......
i是代表轮数 i最多循环ary.length-1次即可
i=0 第一轮 比较 4次 5-1不用和自己比 -0末尾还没有最大的值
i=1 第二轮 比较 3次 5-1不用和自己比 -1末尾有一个最大的值
i=2 第三轮 比较 2次 5-1不用和自己比 -2末尾有两个最大的值
j代表每一轮的次数 j最多循环 ary.length-1-i 次
ary[j]当前值 ary[j+1]是后一项的值
如果当前项的值大于后一项的值的话,两者交换位置
var a=12;
var b=13;
a和b交换位置,如何的交换
var c=null;
c=a;
a=b;
b=c;
冒泡排序
function sortAry(ary) {
for (var i = 0; i < ary.length - 1; i++) {//i是比较的轮数
for (var j = 0; j < ary.length - 1 - i; j++) {//j是每一轮比较的次数
if (ary[j] > ary[j + 1]) {//如果当前的值大于后一项的值,交换位置
var temp = null;
temp = ary[j];
ary[j] = ary[j + 1];
ary[j + 1] = temp;
}
}
}
return ary;
}
var ary = [12, 23, 45, 25, 12, 15, 17, 18, 1, 2, 5, 4, 8, 19];
var res = sortAry(ary);
console.log(res);
数组去重
var ary = [1, 2, 3, 1, 2, 3, 2, 1, 2, 5, 4, 2, 3, 1, 1, 2, 3, 1, 2, 3, 2, 1, 2, 5, 4, 2, 3, 1, 1, 2, 3, 1, 2, 3, 2, 1, 2, 5, 4, 2, 3, 1, 1, 2, 3, 1, 2, 3, 2, 1, 2, 5, 4, 2, 3, 1, 1, 2, 3, 1, 2, 3, 2, 1, 2, 5, 4, 2, 3, 1, 1, 2, 3, 1, 2, 3, 2, 1, 2, 5, 4, 2, 3, 1, 1, 2, 3, 1, 2, 3, 2, 1, 2, 5, 4, 2, 3, 1, 1, 2, 3, 1, 2, 3, 2, 1, 2, 5, 4, 2, 3, 1, 1, 2, 3, 1, 2, 3, 2, 1, 2, 5, 4, 2, 3, 1, 1, 2, 3, 1, 2, 3, 2, 1, 2, 5, 4, 2, 3, 1, 1, 2, 3, 1, 2, 3, 2, 1, 2, 5, 4, 2, 3, 1, 1, 2, 3, 1, 2, 3, 2, 1, 2, 5, 4, 2, 3, 1, 1, 2, 3, 1, 2, 3, 2, 1, 2, 5, 4, 2, 3, 1, 1, 2, 3, 1, 2, 3, 2, 1, 2, 5, 4, 2, 3, 1];
var obj = {};
for (var i = 0; i < ary.length; i++) {
var cur = ary[i];
if (obj[cur] == cur) {
//ary.splice(i, 1);
ary[i] = ary[ary.length - 1];
ary.length -= 1;
i--;
} else {
obj[cur] = cur;
}
}
obj = null;
console.log(ary);
函数数据类型
function是引用数据类型中的一种,是一个函数数据类型,我们把function称之为一个函数,或者一个方法,在或者一个功能
function由两部分组成:定义(把需要实现的功能预先处理好)、执行(需要的时候执行这个方法即可,并且根据需要可以多次执行)
//制定一个约会的方法(计划)
function dating() {
//1、取钱 10000
//2、制定路线方案 爬长城--海洋馆--欢乐谷--国家大剧院--俏江南吃饭--回家
}
//执行计划
dating();
dating();
不知道执行sum的时候,会传递几个数字,我们不管它传递几个,有几个我就处理几个
console.dir(arguments); arguments是每一个函数天生自带的存储传递参数值的集合,以数字作为索引,索引从0开始;length属性代表传递进来参数值的个数;我们把arguments称之为类数组(对象数据类型的)
arguments[0] 第一个参数的值 arguments[1]第二个参数的值 arguments[n]第n+1个参数的值
arguments.length 有多少个参数
function sum() {
var total = 0;
for (var i = 0; i < arguments.length; i++) {
//i=0 拿第一个参数值 arguments[0]
//i=1 拿第二个参数值 argumnets[1]
//arguments[i] 就是每一次循环的时候,拿出来的对应的参数值
var cur = Number(arguments[i]);
if (!isNaN(cur)) {
total += cur;
}
}
return total;
}
var total = sum(1, 2, 3, 4, 5, 6, 7, 8, 9);
console.log(total);
Date类型