用js來實現那些數據結構 第一章

 在開始正式的內容以前,不得不說說js中的數據類型和數據結構,以及一些比較容易讓人混淆的概念。那麼爲何要從數組提及?數組在js中是最多見的內存數據結構,數組數據結構在js中擁有不少的方法,不少初學者記不清數組的大多數用法,只知道push,pop,shift等最基本的幾個。因此,本系列(數組篇)會盡量的讓你們對數組有一個透徹的瞭解。也方便後面其餘數據結構的學習和使用。前端

   可能不少web前端開發者都會有一個疑問,那就是,數組和對象到底是數據類型?仍是數據結構?那麼咱們就帶着這樣的疑問,開始下面的學習,但願看完這篇文章以後,你模糊的概念會變得清晰一些。web

   首先,在js中,數據類型分爲兩種,基本類型(原始類型)和複雜類型,其中,基本類型是:String(字符串),Number(數值),Boolean(布爾值),還有undefinednull。複雜類型是Objecct(對象)。數組

  說到這裏你們可能會有些疑問,只有這六種類型?那數組(Array),正則(RegExp),日期(Date)算是什麼?其實他們都是Object(對象)的一個分支,換句話說它們都屬於Object類型,這也正是js不同凡響的地方——萬物皆對象。然後面要聊的包括隊列,棧,鏈表,集合,樹,圖等數據結構在js中的展示方式,也都是經過對象和原型來實現的。本文無心去詳細的描述數據類型和數據結構的種類以及在js中的體現形式。因此點到爲止。安全

  故事已經開始,請你們繫好安全帶,跟着我馳騁在在這篇廣闊的土地上——數組數據結構

  先解釋一下什麼是數組吧,所謂數組,是有序的元素序列 若將有限個類型相同的變量的集合命名,那麼這個「名」稱爲數組名。組成數組的各個變量稱爲數組的份量,也稱爲數組的元素,有時也稱爲下標變量。用於區分數組的各個元素的數字編號稱爲下標。數組是在程序設計中,爲了處理方便, 把具備相同類型的若干元素按無序的形式組織起來的一種形式。這些無序排列的同類數據元素的集合稱爲數組。簡單來講數組就是用於儲存多個相同類型數據的集合。(固然,js中的數組也能夠存儲不一樣類型數據,可是!不建議這樣作!)學習

  1、數組的建立和初始化spa

  相信不少小夥伴都知道建立一個數組十分容易:設計

var arr = [];

  這樣咱們就建立了一個數組,咱們還能夠用new關鍵字來建立並初始化一個數組:code

//建立一個空數組
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)]
複製代碼

  但願你們仔細看一下這個例子,固然,我仍是一句話說明一下吧。

  其實主旨就是,你所傳的參數不管正負,參數所限定的範圍必須是包含數組元素的。

相關文章
相關標籤/搜索