用js来实现那些数据结构01(数组篇01-数组的增删)

在开始正式的内容以前,不得不说说js中的数据类型和数据结构,以及一些比较容易让人混淆的概念。那么为何要从数组提及?数组在js中是最多见的内存数据结构,数组数据结构在js中拥有不少的方法,不少初学者记不清数组的大多数用法,只知道push,pop,shift等最基本的几个。因此,本系列(数组篇)会尽量的让你们对数组有一个透彻的了解。也方便后面其余数据结构的学习和使用。前端

   可能不少web前端开发者都会有一个疑问,那就是,数组和对象到底是数据类型?仍是数据结构?那么咱们就带着这样的疑问,开始下面的学习,但愿看完这篇文章以后,你模糊的概念会变得清晰一些。web

   首先,在js中,数据类型分为两种,基本类型(原始类型)和复杂类型,其中,基本类型是:String(字符串),Number(数值),Boolean(布尔值),还有undefinednull。复杂类型是Objecct(对象)。数组

  说到这里你们可能会有些疑问,只有这六种类型?那数组(Array),正则(RegExp),日期(Date)算是什么?其实他们都是Object(对象)的一个分支,换句话说它们都属于Object类型,这也正是js不同凡响的地方——万物皆对象。然后面要聊的包括队列,栈,链表,集合,树,图等数据结构在js中的展示方式,也都是经过对象和原型来实现的。本文无心去详细的描述数据类型和数据结构的种类以及在js中的体现形式。因此点到为止。安全

  故事已经开始,请你们系好安全带,跟着我驰骋在在这篇广阔的土地上——数组数据结构

  先解释一下什么是数组吧,所谓数组,是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个“名”称为数组名。组成数组的各个变量称为数组的份量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具备相同类型的若干元素按无序的形式组织起来的一种形式。这些无序排列的同类数据元素的集合称为数组。简单来讲数组就是用于储存多个相同类型数据的集合。(固然,js中的数组也能够存储不一样类型数据,可是!不建议这样作!)学习

  1、数组的建立和初始化设计

相信不少小伙伴都知道建立一个数组十分容易:对象

var arr = [];

  这样咱们就建立了一个数组,咱们还能够用new关键字来建立并初始化一个数组:队列

//建立一个空数组
var newArr = new Array();
//建立一个指定长度的数组
var newLenArr = new Array(4);
//建立一个具备指定参数的数组
var numArr = new Array(1,2,3,4);

  固然,经过new关键字建立并初始化数组的方式并不推荐,这里只是给你们介绍一下。其实咱们经过上面第一种方式来建立数组的本质就是经过new来实例化一个Array对象。OK,这里很少说它的实现原理,仍是回到数组自己来吧。内存

  那么咱们如何读取数组中的数据呢?很简单,我就一句话带过了,也就是经过中括号([ ])arr[2],来传递数值的位置,获取到对应位置的值,也能够经过这种方式来从新赋值。

  2、数组的增删

  接下来讲说如何使用js数组自带的方法来实现数组头尾的增删:push(数组尾部插入元素),unshift(数组头部插入元素),pop(数组尾部删除元素)和shift(数组头部删除元素)

  一、push方法

  若是我不想使用push方法,有没有什么方式能够在数组的尾部插入一个元素呢?其实很简单,咱们只须要把值赋给数组中最后一个空位上的元素就能够了。

var nums = [0,1,2,3,4];
nums[nums.length] = 5;

  咱们经过length属性,获取该数组的长度是5,可是咱们数组对应的下标是从0开始的,经过这样的方式,也就给数组的尾部插入了一个新的元素。固然,其实咱们能够更方便的使用push来给数组的尾部插入一个元素:

var nums = [0,1,2,3,4];
nums.push(5);

  也能够获得一样的结果。固然,push也能够传入多个参数,依次的从尾部插入数组:

var nums = [0,1,2,3,4];
nums.push(5,6,6);
//[0,1,2,3,4,5,6,6]

  二、unshift方法

  那么一样的,如何在不使用原生方法的前提下给数组的头部添加一个元素呢?

var nums = [0,1,2,3,4,5,6];
for(var i = nums.length;i >= 0;i--){
  nums[i] = nums[i - 1];      
}
//[undefined, 0, 1, 2, 3, 4, 5, 6]
nums[0] = -1;
//[-1, 0, 1, 2, 3, 4, 5, 6]

  实际上,咱们经过循环遍历,把nums数组中的每一位所对应的下标增长一个,也就是向后移动一位,那么这就致使了头部的位置空出(它的位置是存在的),可是此时咱们并无给空出的位置所对应的下标赋值,因此它的长度增长了值确实undefined,赋值以后,才会获得咱们想要的结果。

  下面咱们仍是用unshift方法来给数组的头部插入新值:

var nums = [0,1,2,3,4,5];
nums.unshift(-1);
//[-1, 0, 1, 2, 3, 4, 5]
nums.unshift(-2,-3);
//[-2, -3, -1, 0, 1, 2, 3, 4, 5]

  那么要注意一点,在使用unshift传入多个参数的时候,他会把第一个参数放在数组的头部(以此类推),也就是说unshift方法会把全部的参数依照顺序插入数组,并非咱们想固然的那样从第一个参数依次添加进数组。

  三、pop方法

  若是我想要删除数组尾部的元素,咱们可使用pop方法,其实咱们仍是能够用js来模拟一下pop:

var nums = [0,1,2,3,4,5];
nums.length = nums.length - 1;
//[0, 1, 2, 3, 4]

  咱们能够经过手动让数组的长度减小一位,就能够实现删除数组尾部的元素,固然也能够减小两位三位等。

  实际上,在平常开发中一般都会使用pop方法来删除数组尾部的元素(pop()方法没有参数,只是删除数组尾部的元素。):

var nums = [0,1,2,3,4,5];
nums.pop()
// [0, 1, 2, 3, 4]

四、shift方法

  那么接下来咱们看看如何从数组的首位删除元素:

var nums = [0,1,2,3,4,5];
for(var i = 0; i < nums.length; i++) {
    nums[i] = nums[i + 1]
}
// [1, 2, 3, 4, 5, undefined]

  能够看到,咱们最后一位是undefined,也就是说在最后一次的循环里,i + 1引用了一个数组里还未初始化的位置(开辟了空间可是未赋值),因此,这样的方式只是依次覆盖了上一位的值,并无真正的删除元素。若是想要删除首位的元素,这就须要用到shift方法了。

var nums = [0,1,2,3,4,5];
nums.shift();
// [1, 2, 3, 4, 5]

五、splice方法

  最后,咱们看看如何使用splice()方法,在数组的任意位置添加和删除元素:

var nums = [0,1,2,3,4,5,6,7];
nums.splice(2);
//[0, 1]
//若是只加一个参数,说明删除从下标2开始的全部的后面的元素
var nums = [0,1,2,3,4,5,6,7];
nums.splice(2,1);
//[0, 1, 3, 4, 5, 6, 7]
//若是加入两个参数,则为删除从下标2开始的后面的几个元素。
var nums = [0,1,2,3,4,5,6,7];
nums.splice(2,1,"a","b","c");
//[0, 1, "a", "b", "c", 3, 4, 5, 6, 7]
//三个或多个参数,意味着删除从下标2(第一个参数)开始的后面的1个(第二个参数)元素,并在下标2的后面加入从第三个参数开始的后面的全部参数,把第二个参数设置为0就能够不删除元素从而实现从任意位置添加元素

  再多说一点,咱们还可使用delete操做符来删除数组中的元素,可是实际上,delete只是删除了对应下标上所存储的值,并无同时把存储值得空间也删除掉,会致使对应位置上的值为undefined:

var nums = [0,1,2,3,4,5,6,7];
delete nums[2];
//[0, 1,  undefined, 3, 4, 5, 6, 7]

  splice()方法是修改了原数组的。

六、slice()

    slice()方法,会返回参数选定的范围的数组。该方法有两个参数,start(必选)和end(可选)。这两个值能够为负数,若是为负数则默认从尾部的第一个参数算起,也就是说-1就是数组的最后一个元素,-2就是数组的倒数第二个元素,以此类推。若是不传end,则默认从start开始直到数组最后一个元素都会被截取。

var nums = [0,1,2,3,4,5,6,6,7,"a",9,10,{name:"zaking"},["b","c"]];
var a = nums.slice(1,5);
console.log(a);//[1, 2, 3, 4]
var b = nums.slice(-1,5);
console.log(b);//[]
var c = nums.slice(-1,-5);
console.log(c);//[]
var d = nums.slice(-5,-1);
console.log(d);// ["a", 9, 10, {…}]
var f = nums.slice(5,1);
console.log(f);//[]
var x = nums.slice(5);
console.log(x);// [5, 6, 6, 7, "a", 9, 10, {…}, Array(2)]
var y = nums.slice(-5);
console.log(y)//["a", 9, 10, {…}, Array(2)]

  但愿你们仔细看一下这个例子,固然,我仍是一句话说明一下吧。

其实主旨就是,你所传的参数不管正负,参数所限定的范围必须是包含数组元素的。

  那么数组的一些基本用法就先介绍到这里,后面应该还有两篇左右的长度来介绍数组。花费如此的篇幅,实在是数组真的极为重要,还请你们不要着急。当真正的学会了数组以后,再去看栈,队列这种数据结构,其实就很简单了。

  最后,因为本人水平有限,能力与大神仍相差甚远,如有错误或不明之处,还望你们不吝赐教指正。很是感谢!

相关文章
相关标签/搜索