亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

細(xì)說JS數(shù)組

starsfun / 2924人閱讀

摘要:數(shù)組元素的讀寫使用訪問數(shù)組元素時,將索引轉(zhuǎn)換為字符串,然后將其作為屬性名一樣使用。第一個參數(shù)應(yīng)該在前只展開一層數(shù)組元素不變,返回注意,只拼接第一層結(jié)構(gòu)。

此乃犀牛書(第七章 數(shù)組)讀書筆記,又結(jié)合了ES6中數(shù)組的擴展部分做的知識梳理。
精華部分就是手工繪制的兩張數(shù)組總結(jié)圖了。
靈活運用數(shù)組的各種方法是基本功,是基本功,是基本功,重要的事情說三遍。
好了,正文從下面開始~

數(shù)組的基本概念 什么是數(shù)組,數(shù)組元素,數(shù)組索引

對象是屬性的無序集合,而數(shù)組是值的有序集合;
每個值叫做一個元素,每個元素在數(shù)組中的位置稱為索引;

JS數(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ū)別?

使用for循環(huán),可以從后向前遍歷數(shù)組,而使用方法則做不到。

sort方法不可不知

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

相關(guān)文章

  • 淺談細(xì)說 JS 函數(shù)(call,apply,重載)

    摘要:什么是函數(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ù)的基本語法是這樣的:...

    U2FsdGVkX1x 評論0 收藏0
  • 細(xì)說數(shù)組常用遍歷的方法

    摘要:需要返回值,如果不給,默認(rèn)返回使用場景假定有一個數(shù)值數(shù)組將數(shù)組中的值以雙倍的形式放到數(shù)組寫法方法使用場景假定有一個對象數(shù)組將數(shù)中對象某個屬性的值存儲到數(shù)組中三從數(shù)組中找出所有符合指定條件的元素檢測數(shù)值元素,并返回符合條件所有元素的數(shù)組。 showImg(https://segmentfault.com/img/remote/1460000016810336?w=1149&h=524);...

    阿羅 評論0 收藏0
  • 細(xì)說數(shù)組常用遍歷的方法

    摘要:需要返回值,如果不給,默認(rèn)返回使用場景假定有一個數(shù)值數(shù)組將數(shù)組中的值以雙倍的形式放到數(shù)組寫法方法使用場景假定有一個對象數(shù)組將數(shù)中對象某個屬性的值存儲到數(shù)組中三從數(shù)組中找出所有符合指定條件的元素檢測數(shù)值元素,并返回符合條件所有元素的數(shù)組。 showImg(https://segmentfault.com/img/remote/1460000016810336?w=1149&h=524);...

    AlphaWatch 評論0 收藏0
  • 細(xì)說數(shù)組常用遍歷的方法

    摘要:需要返回值,如果不給,默認(rèn)返回使用場景假定有一個數(shù)值數(shù)組將數(shù)組中的值以雙倍的形式放到數(shù)組寫法方法使用場景假定有一個對象數(shù)組將數(shù)中對象某個屬性的值存儲到數(shù)組中三從數(shù)組中找出所有符合指定條件的元素檢測數(shù)值元素,并返回符合條件所有元素的數(shù)組。 showImg(https://segmentfault.com/img/remote/1460000016810336?w=1149&h=524);...

    ?xiaoxiao, 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<