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