【亡羊补牢】JS灵魂之问 第22期 修炼内功 数组的一系列操作

引言

有几天没有更新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' ]

最后

文章产出不易,还望各位小伙伴们支持一波!

往期精选:

小狮子前端の笔记仓库

访问超逸の博客,方便小伙伴阅读玩耍~

学如逆水行舟,不进则退

猜你喜欢

转载自blog.csdn.net/weixin_42429718/article/details/108677532
今日推荐