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