引言
有几天没有更新JS灵魂之问的专栏系列文章了,秋招季,也在忙着备战笔试面试。今天得空再来写一篇文章,本篇要讲解的内容是关于 数组的一系列操作
,那今天这篇看能不能问倒你了,一起来探索一下吧。
仰望星空的人,不应该被嘲笑
文章目录
数组
先来一些前置知识,后续我们会把数组相关知识好好整理一番。
创建数组
/* 创建数组 */
var arr1 = []; // 通过字面量创建
var arr2 = new Array(); // 通过系统内置的Array构造函数
所有的数组都继承于 Array.prototype
。
看看下面这个,会输出什么呢?
var arr = [, ,];
console.log(arr);
答案是 [ <2 empty items> ]
,诶,我明明有三个空的,为啥是两个 empty
呢?此时,我们打印一下长度看看,发现还是 2
。
console.log(arr.length); // 2
好了,不布置坑了,直接看下面这例子吧:
var arr = [, 1,3,5,7,];
console.log(arr); // [ <1 empty item>, 1, 3, 5, 7 ]
console.log(arr.length); // 5
从结果看出来,发现数组内置会有一个截取,最后一个空,它不会算。(注意,只是最后为空的元素不会算)这就叫做稀疏数组
那么,我们可以直接造100
个为空的数组吗?而不是一个个赋值为空,当然可以,用构造函数即可:
var arr = new Array(100);
console.log(arr) // [ <100 empty items> ]
在原数组上修改
push / unshift
看看会输出什么?
var arr = [1,2,3,4];
console.log(arr.push(5));
答案是 5
,诶,你会不会一位会打印数组,当然不是哈, push / unshift
返回值是执行方法以后数组的长度。
举个例子:
var arr = [1,2,3,4];
console.log(arr.push(5));
console.log(arr.unshift(0));
console.log(arr);
答案如下:
5
6
[ 0, 1, 2, 3, 4, 5 ]
重写 push 方法
Array.prototype.myPush = function(){
for(var i=0;i<arguments.length;i++){
this[this.length] = arguments[i];
}
return this.length;
}
var arr = [1,2,3,4];
console.log(arr.myPush(5)); // 5
console.log(arr); // [ 1, 2, 3, 4, 5 ]
pop / shift
它们没有参数,返回值为弹出去的 value
值
var arr = [1,2,3,4];
var tmp = arr.pop();
console.log(tmp); // 4
var tmp2 = arr.shift();
console.log(tmp2); // 1
reverse
var arr = [1,2,3];
arr.reverse();
console.log(arr); // [ 3, 2, 1 ]
splice
// arr.splice(开始项的下标,剪切长度,剪切以后最后一位开始添加数据)
var arr = ['a', 'b', 'c'];
arr.splice(1,2);
console.log(arr); // ['a']
arr.splice(1,0,2,3);
console.log(arr) // [ 'a', 2, 3 ]
sort()
var arr = [-1,-5,8,0,2];
console.log(arr.sort()); // [ -1, -5, 0, 2, 8 ]
var arr = ['b','z','h','i','a'];
console.log(arr.sort()); // [ 'a', 'b', 'h', 'i', 'z' ]
好的,在你以为按照升序排列后,我们再来看看下面又会打印什么?
var arr = [27,49,5,7];
console.log(arr.sort());
答案是 [ 27, 49, 5, 7 ]
,发现奇怪的事情,居然不排序了???现在来好好解释一下,原来数组是按照 ASCII
码来排序的。
那么,为了自定义排序, sort
里面可以传一个回调函数进来。看看下面例子吧:
/*
sort 按照ascii码来进行排序
1、参数a,b
2、返回值:负值,a 就排在前面
正值,b 就排在前面
0, 保持不动
*/
var arr = [27, 49, 5, 7];
arr.sort((a,b)=>a-b);
console.log(arr); // [ 5, 7, 27, 49 ]
arr.sort((a,b)=>b-a);
console.log(arr); // [ 49, 27, 7, 5 ]
可以以冒泡排序为例,当 a-b
返回值为正数的时候,就将 a
冒泡上去,然后就是从小到大排序啦。
总结归纳:
修改原数组的方法:
push/unshift pop/shift reverse splice sort
新建数组(不对原数组产生影响)
concat
var arr1 = ['a', 'b', 'c'];
var arr2 = ['d', 'e', 'f'];
var arr3 = arr1.concat(arr2);
console.log(arr3); // [ 'a', 'b', 'c', 'd', 'e', 'f' ]
toString()
var arr = [1, 2, 3];
var arr1 = arr.toString();
console.log(arr); // [ 1, 2, 3 ]
console.log(arr1); // 1,2,3
slice
数组切割,有两个可选参数,第一个参数为 start
,第二个参数为 end
,区间为 [ start, end)
var arr = ['a', 'b', 'c', 'd', 'e', 'f'];
var arr1 = arr.slice(1);
console.log(arr1); // [ 'b', 'c', 'd', 'e', 'f' ]
join
var arr = ['a','b','c','d'];
var str1 = arr.join();
var str2 = arr.toString();
var str3 = arr.join('');
console.log(str1); // a,b,c,d
console.log(str2); // a,b,c,d
console.log(str3); // abcd
split
var arr = ['a', 'b', 'c', 'd'];
var str1 = arr.join('-');
console.log(str1); // a-b-c-d
var arr1 = str1.split('-')
console.log(arr1); // [ 'a', 'b', 'c', 'd' ]
var arr2 = str1.split('-', 3)
console.log(arr2); // [ 'a', 'b', 'c' ]
最后
文章产出不易,还望各位小伙伴们支持一波!
往期精选:
访问超逸の博客,方便小伙伴阅读玩耍~
学如逆水行舟,不进则退