摘要:數組還有的一個特別之處是數組可以包含任何類型的數據,混合型的,很強大。由已有數組創建新數組和方法允許通過已有數組創建數組。
數組的定義
數組是一個線性分配的內存, 存儲的元素可以通過索引(通常為數字)來任意存取,而這個索引(也就是我們所謂的下標,從0開始)用來計算元素之間存儲的位置的偏移量(其實就是為了區分不同的數據)。
js的數組和其它編程語言有些不同,表面上看和大多編程語言的數組差不多,但在內部卻有著不一樣的實現。js提供了一些類數組(array-like)特性的對象。它會把數組的下標轉變成字符串,變成一個對象的屬性。比如
var numbers = ["zero", "one", "two"];
這個簡單的數組會被轉換為
var numbers_object = {"0": "zero", "1": "one", "2": "two"};
從代碼本身的功能來說沒有太大區別,剛好有相同的名字和值。但是numbers繼承了Array.prototype,而numbers_object繼承了Object.prototype。所以numbers就有了大量有用好玩的方法,還有一個特別的length屬性。
js數組還有的一個特別之處是數組可以包含任何類型的數據,混合型的,很強大。
特別的length屬性
每個數組都有一個length屬性,length是沒有上界的。如果用大于等于數組長度的數字作為下標來存儲元素,那么length的值就會增大來容納新元素,不會發生數組越界。
var array = [10];
var array[11] = "iCoding";
array.length //12
那么問題來了,js數組有沒有下界。一般情況下數組都是從0開始的,如果執行array[-1] = "net"會發生什么情況呢?數組的長度length會怎樣變化?抱著刨根問題的精神回答,js數組會給array增加屬性為-1的 "-1": "net" 元素 ,其實本質就是上面所說的轉換成對象,此時我們查詢length的值并未發生變化,估計js源代碼的length屬性的值是從0開始計數的。
創建數組
最簡單的方式
var numbers = [ ]; //length = 0
直接放入一組元素
var numbers = [1,2,3]; //length = 3
通過構造函數創建數組
var numbers = new Array(); //length = 0
同樣可以直接放入一組元素
var numbers = new Array(1,2,3); //length = 3
那么那種方式最好?大多數javascript專家推薦使用[ ] 操作符,和使用構造函數相比,這種方式被認為效率最高。
數組操作 增array[array.length] = "iCoding"; --> ["zero", "one", "two", "iCoding"] array.push("net"); --> ["zero", "one", "two", "iCoding", "net"]刪
由于JavaScript的數組其實就是對象,所以delete運算符可以用來從數組中移除元素
delete array[1]; --> ["zero", , "two", "iCoding", "net"]
但是這種方式會在數組中留下一空洞。因為排在后面的元素還會保留著它們最初的屬性。
JavaScript中有一個splice方法
var array = ["zero", "one", "two", "iCoding", "net"]
array.splice(1, 1); -->["zero", "two", "iCoding", "net"]
其中splice第一個參數表示移除的位置,第二個參數表示移除元素的個數。
但是不好的一點是:被刪除屬性后面的每一個屬性必須被移除,并且以一個新的鍵值重新插入,如果操作大型數組,效率可能就會不高。
改
如果想修改數組,依然可以用splice方法
var array = ["a", "b", "c", "d", "e"];
array.splice(3, 1, "icoding", "net"); -->["a", "b", "c", "icoding", "net", "e"];
對數組的整體性操作
淺復制
當我們將一個數組賦給另外一個數組,只是為被賦值的數組增加了一個新的引用。當你通過原引用修改了數組的值,另一個引用也會感知到這個變化,相應的值就會發生改變。這種行為被稱為淺復制。
var nums = [0, 1, 2, 3]; var same_nums = nums; nums[1] = 99; console.log(same_nums[1]); //99
深復制
顧名思義,也就是我們不同通過引用來改變另一個自己。寫個函數就ok了。
function copy(arr1, arr2) { for(var i = 0, i < arr1.length, i++) { arr2[i] = arr1[i]; } }
將每個數組中的值遍歷出來在重新賦值到新數組中,在我們程序中調用一下就好了。
var nums = [0, 1, 2, 3]; var same_nums = [] copy(nums, same_nums); nums[1] = 99; console.log(same_nums[1]); //1
數組轉化成字符串
這里有join()和toString()兩個方法。
var names = ["joes", "beyond"]; var namestr1 = names.join(); console.log(namestr); //"joes,beyond" var namestr2 = names.toString(); console.log(namestr); //"joes,beyond"
由已有數組創建新數組
contact()和splice()方法允許通過已有數組創建數組。contact方法可以合并多個數組創建一個數組,splice()方法截取一個數組的子集創建一個新數組。
我們先來看看contact()方法的工作原理。隨意創建2個數組。
var nums1 = [1, 2, 3, 4, 5]; var nums2 = [6, 7, 8, 9]; var mix_nums = nums1.contact(nums2); console.log(mix_nums); // [1, 2, 3, 4, 5, 6, 7, 8, 9]參考
Michael McMillan.《Data Structures & Algorithms with JavaScript》
Douglas Crockford.《JavaScript: The Good Parts》
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/86285.html
摘要:今天同學去面試,做了兩道面試題全部做錯了,發過來給道典型的面試題前端掘金在界中,開發人員的需求量一直居高不下。 排序算法 -- JavaScript 標準參考教程(alpha) - 前端 - 掘金來自《JavaScript 標準參考教程(alpha)》,by 阮一峰 目錄 冒泡排序 簡介 算法實現 選擇排序 簡介 算法實現 ... 圖例詳解那道 setTimeout 與循環閉包的經典面...
摘要:代碼實現六堆排序算法簡介堆排序是指利用堆這種數據結構所設計的一種排序算法。九計數排序算法簡介計數排序是一種穩定的排序算法。計數排序不是比較排序,排序的速度快于任何比較排序算法。 贊助我以寫出更好的文章,give me a cup of coffee? 2017最新最全前端面試題 1、插入排序 1)算法簡介 插入排序(Insertion-Sort)的算法描述是一種簡單直觀的排序算法。它...
摘要:于是翻出了機房里的這本學習數據結構與算法開始學習程序員的基礎知識。這本書用了我最熟悉的來實現各種數據結構和算法,而且書很薄,可以說是一本不錯的入門教程。隊列在頭部刪除元素,尾部添加元素。 本系列所有文章:第一篇文章:學習數據結構與算法之棧與隊列第二篇文章:學習數據結構與算法之鏈表第三篇文章:學習數據結構與算法之集合第四篇文章:學習數據結構與算法之字典和散列表第五篇文章:學習數據結構與算...
摘要:分治算法遞歸每層操作分解將原問題分解成一系列的子問題。分治算法滿足的條件可分解原問題與分解成的小問題具有相同的模式無關聯原問題分解成的子問題可以獨立求解,子問題之間沒有相關性,這一點是分治算法跟動態規劃的明顯區別。 Time:2019/4/10Title: Merge K Sorted ListsDifficulty: DifficultyAuthor: 小鹿 題目:Merge K...
閱讀 1368·2021-11-24 09:39
閱讀 1358·2021-11-04 16:12
閱讀 2702·2021-09-24 09:47
閱讀 3348·2021-09-01 10:50
閱讀 1488·2019-08-30 15:55
閱讀 1436·2019-08-30 15:43
閱讀 653·2019-08-30 11:08
閱讀 3589·2019-08-23 18:33