摘要:數(shù)組元素的讀寫使用訪問數(shù)組元素時(shí),將索引轉(zhuǎn)換為字符串,然后將其作為屬性名一樣使用。第一個(gè)參數(shù)應(yīng)該在前只展開一層數(shù)組元素不變,返回注意,只拼接第一層結(jié)構(gòu)。
此乃犀牛書(第七章 數(shù)組)讀書筆記,又結(jié)合了ES6中數(shù)組的擴(kuò)展部分做的知識(shí)梳理。
精華部分就是手工繪制的兩張數(shù)組總結(jié)圖了。
靈活運(yùn)用數(shù)組的各種方法是基本功,是基本功,是基本功,重要的事情說三遍。
好了,正文從下面開始~
對(duì)象是屬性的無序集合,而數(shù)組是值的有序集合;
每個(gè)值叫做一個(gè)元素,每個(gè)元素在數(shù)組中的位置稱為索引;
JS數(shù)組是無類型的:數(shù)組元素可以是任意類型,同一個(gè)數(shù)組中的元素也可能有不同類型;
JS數(shù)組是動(dòng)態(tài)的:可根據(jù)需要增長(zhǎng)或縮減;
JS數(shù)組可能是稀疏的:數(shù)組元素的索引不一定是連續(xù)的。
稀疏數(shù)組稀疏數(shù)組length屬性值大于元素的個(gè)數(shù)
創(chuàng)建稀疏數(shù)組的兩種方法:
var a= []; a[1000] =1 //直接量
var a = [1,2,3,4,5,6]; delete a[0]; //刪除從而使得不連續(xù)數(shù)組對(duì)象和普通對(duì)象的聯(lián)系和區(qū)別?
數(shù)組是特殊的對(duì)象,使用[]訪問數(shù)組元素就像使用[]訪問對(duì)象屬性一樣(索引就是屬性名)
數(shù)組的特別之處在于,當(dāng)使用小于2的32次方的非負(fù)整數(shù)作為屬性名時(shí)數(shù)組會(huì)自動(dòng)維持其length屬性值,length屬性使得數(shù)組區(qū)別于常規(guī)JS對(duì)象。
當(dāng)為數(shù)組元素賦值時(shí),索引i大于或等于length,length屬性變?yōu)閕+1;
當(dāng)設(shè)置數(shù)組length屬性小于當(dāng)前數(shù)組長(zhǎng)度時(shí),大于的部分將被刪除;
也可以設(shè)置數(shù)組的length屬性大于當(dāng)前數(shù)組長(zhǎng)度,這時(shí)后面會(huì)創(chuàng)建空區(qū)域;
可以使用Object.defineProperty()將數(shù)組length屬性設(shè)置為只讀的。
如何判斷一個(gè)對(duì)象是數(shù)組對(duì)象?
ES5提供了一個(gè)方法:
Array.isArray(a) // true or false
還可以通過檢查對(duì)象的類屬性(class)
Object.prototype.toString.call(a) == "[object array]" //這里需要使用Object的toString方法,因?yàn)锳rray的toString方法被重寫了。
注意:使用instanceof判斷數(shù)組對(duì)象是不靠譜的。這是因?yàn)楫?dāng)跨越多個(gè)窗體時(shí),檢測(cè)會(huì)失敗。
類數(shù)組對(duì)象類數(shù)組對(duì)象:擁有l(wèi)ength屬性,屬性是非負(fù)整數(shù)的對(duì)象
數(shù)組方法在類數(shù)組對(duì)象上也能work, 類數(shù)組對(duì)象不能直接調(diào)用數(shù)組的方法,但可以間接調(diào)用
常見的類數(shù)組對(duì)象:arguments對(duì)象、一些DOM方法的返回
數(shù)組的操作(創(chuàng)建、讀寫、添加、刪除、遍歷)及方法下面用一張圖來總結(jié)一下數(shù)組的方法:
這張圖是按照ES標(biāo)準(zhǔn)發(fā)展的順序總結(jié)了標(biāo)準(zhǔn)中數(shù)組提供的方法,畫完圖的我表示嚇了一跳。ES6竟然提供了這么多新的方法??磥硎褂玫氖窍喈?dāng)不充分。以后要考慮少用underscore了。。。
上圖中每個(gè)方法可能可以實(shí)現(xiàn)不止一種功能(例如splice既能實(shí)現(xiàn)為數(shù)組增加元素,又能刪除數(shù)組元素),那么按照數(shù)組操作劃分,這張圖又可以變成下面這個(gè)樣子:
下面對(duì)上述兩張圖里面的部分知識(shí)進(jìn)行詳細(xì)說明和demo演示。
創(chuàng)建數(shù)組的三種方法數(shù)組直接量
var a = [1, true,"hi"]; var b = [,,] //undefined*2
new + Array
var a = new Array() var b = new Array(10) var c = new Array(1,2)
Array.of()
Array.of(1,2,3) //[1,2,3]
這是ES6中提供的方法,為了彌補(bǔ)new+Array在傳入不同個(gè)數(shù)的參數(shù)時(shí)輸出不一致的問題。
數(shù)組元素的讀寫:[]使用"[]"訪問數(shù)組元素時(shí),js將索引轉(zhuǎn)換為字符串,然后將其作為屬性名一樣使用。
//注意使用負(fù)整數(shù)和浮點(diǎn)數(shù)作為索引時(shí): a[-123] //同a["-123"] a[1.000] //同a[1]為數(shù)組添加元素有至少下面這么多辦法:
var a = []; a[1] = 1; a.push(1) a.unshift(1) //以上都使得a變成了[1]delete刪除數(shù)組元素不改變length
delete刪除數(shù)組元素是不改變數(shù)組的length的,也不會(huì)讓其他數(shù)組元素索引發(fā)生改變,會(huì)讓數(shù)組變?yōu)橄∈钄?shù)組。
遍歷數(shù)組元素有什么方法?最簡(jiǎn)單的方案就是使用for循環(huán),那么,使用for循環(huán)遍歷數(shù)組時(shí)可以有哪些優(yōu)化點(diǎn)?
首先,如果數(shù)組不是稠密的,應(yīng)該加判斷排除null, undefined和不存在的元素,以避免多余循環(huán);
其次,數(shù)組長(zhǎng)度應(yīng)該先求出來,而非每次循環(huán)都去查詢長(zhǎng)度,但是這種適用于在遍歷過程中不修改數(shù)組長(zhǎng)度的情況(試一下一邊遍歷,一邊刪除數(shù)組元素的情況);
使用for循環(huán)和使用forEach,map這些方法有什么區(qū)別?
sort方法不可不知使用for循環(huán),可以從后向前遍歷數(shù)組,而使用方法則做不到。
sort() 直接使用時(shí)是按照字母順序排列的。如果想要根據(jù)數(shù)值大小順序排列,可以在回調(diào)函數(shù)里指定。
var a= [33,4,1111,222] a.sort() //[1111,222,33,4] a.sort((a,b)=>{ return a-b //<0 第一個(gè)參數(shù)應(yīng)該在前 }) //[4,33,222,1111]concat()只展開一層數(shù)組元素
var a = [1,2,3] var b = a.concat(4,5) //a不變,返回[1,2,3,4,5]
注意,concat只拼接第一層結(jié)構(gòu)。
另外,使用擴(kuò)展運(yùn)算符同樣能實(shí)現(xiàn)數(shù)組拼接:
var a = [1,2,3] var b = [...a,4,5]厲害的splice()
splice既能刪除元素,也能插入元素,取決于有咩有第三個(gè)參數(shù)
splice是修改數(shù)組本身的,但是slice方法是不修改數(shù)組本身的。
var a = [1,2,3,4,5,6] a.splice(4) //a: [1,2,3,4] a.splice(2,1) //[1,2,4] a.splice(2,1,3) //[1,2,3]ES5數(shù)組的方法都有的一些特點(diǎn)
ES5數(shù)組方法的特點(diǎn):
第一個(gè)參數(shù)是函數(shù),對(duì)數(shù)組的每個(gè)元素調(diào)用一次該函數(shù)
如果是稀疏數(shù)組,對(duì)不存在的元素不調(diào)用傳遞的函數(shù)(wow)
不修改原始數(shù)組
forEach方法forEach 不能break , 想break 需要try catch
forEach不修改原始數(shù)組,想修改,可以借助第三個(gè)參數(shù)
var data = [1,2,3,4,5,6] data.forEach((ele, index, dd)=>{ dd[index] = ele + 1 }) //data: [2,3,4,5,6,7]map 通常都需要一個(gè)return:
map方法也不修改原始數(shù)組
var b = a.map(function(ele){return ele+1})indexOf()與includes()方法的比較
indexOf方法有兩個(gè)缺點(diǎn):
不夠語義化,它的含義是找到參數(shù)值出現(xiàn)的第一個(gè)位置,所以要去比較是否不等于-1
內(nèi)部使用嚴(yán)格運(yùn)算符"===",所以會(huì)導(dǎo)致對(duì)NaN的誤判
[NaN].indexOf(NaN) //-1
而includes方法沒有這個(gè)問題。
[NaN].includes(NaN) //true
關(guān)于數(shù)組的方法眾多,在使用時(shí)多嘗試不同的方法,方能熟記各類方法的特點(diǎn)。
未完待續(xù)~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/81346.html
摘要:什么是函數(shù)引用的原話函數(shù)是一組可以隨時(shí)隨地運(yùn)行的語句。函數(shù)是由這樣的方式進(jìn)行聲明的關(guān)鍵字函數(shù)名一組參數(shù),以及置于括號(hào)中的待執(zhí)行代碼。 什么是函數(shù)? 引用 W3School 的原話: 函數(shù)是一組可以隨時(shí)隨地運(yùn)行的語句。 函數(shù)是 ECMAScript 的核心。 函數(shù)是由這樣的方式進(jìn)行聲明的:關(guān)鍵字 function、函數(shù)名、一組參數(shù),以及置于括號(hào)中的待執(zhí)行代碼。 函數(shù)的基本語法是這樣的:...
摘要:需要返回值,如果不給,默認(rèn)返回使用場(chǎng)景假定有一個(gè)數(shù)值數(shù)組將數(shù)組中的值以雙倍的形式放到數(shù)組寫法方法使用場(chǎng)景假定有一個(gè)對(duì)象數(shù)組將數(shù)中對(duì)象某個(gè)屬性的值存儲(chǔ)到數(shù)組中三從數(shù)組中找出所有符合指定條件的元素檢測(cè)數(shù)值元素,并返回符合條件所有元素的數(shù)組。 showImg(https://segmentfault.com/img/remote/1460000016810336?w=1149&h=524);...
摘要:需要返回值,如果不給,默認(rèn)返回使用場(chǎng)景假定有一個(gè)數(shù)值數(shù)組將數(shù)組中的值以雙倍的形式放到數(shù)組寫法方法使用場(chǎng)景假定有一個(gè)對(duì)象數(shù)組將數(shù)中對(duì)象某個(gè)屬性的值存儲(chǔ)到數(shù)組中三從數(shù)組中找出所有符合指定條件的元素檢測(cè)數(shù)值元素,并返回符合條件所有元素的數(shù)組。 showImg(https://segmentfault.com/img/remote/1460000016810336?w=1149&h=524);...
摘要:需要返回值,如果不給,默認(rèn)返回使用場(chǎng)景假定有一個(gè)數(shù)值數(shù)組將數(shù)組中的值以雙倍的形式放到數(shù)組寫法方法使用場(chǎng)景假定有一個(gè)對(duì)象數(shù)組將數(shù)中對(duì)象某個(gè)屬性的值存儲(chǔ)到數(shù)組中三從數(shù)組中找出所有符合指定條件的元素檢測(cè)數(shù)值元素,并返回符合條件所有元素的數(shù)組。 showImg(https://segmentfault.com/img/remote/1460000016810336?w=1149&h=524);...
閱讀 1538·2021-09-22 15:35
閱讀 2017·2021-09-14 18:04
閱讀 891·2019-08-30 15:55
閱讀 2460·2019-08-30 15:53
閱讀 2689·2019-08-30 12:45
閱讀 1210·2019-08-29 17:01
閱讀 2589·2019-08-29 15:30
閱讀 3523·2019-08-29 15:09