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