摘要:對象構造函數(shù)是的原生對象,同時也是一個構造函數(shù),可以用它生成新的數(shù)組。典型的偽數(shù)組有函數(shù)的對象,以及大多數(shù)元素集,還有字符串。,返回一個布爾值,表示判斷數(shù)組成員是否符合某種條件。二是,它內(nèi)部使用嚴格相等運算符進行判斷,這會導致對的誤判。
Array對象 構造函數(shù)
Array是 JavaScript 的原生對象,同時也是一個構造函數(shù),可以用它生成新的數(shù)組。
如果沒有使用new,運行結果也是一樣的。
var arr = new Array(2); // 等同于var arr = Array(2);
Array構造函數(shù)有一個很大的缺陷,就是不同的參數(shù),會導致它的行為不一致。
// 無參數(shù)時,返回一個空數(shù)組 new Array() // [] // 單個正整數(shù)參數(shù),表示返回的新數(shù)組的長度 new Array(1) // [ empty ] new Array(2) // [ empty x 2 ] // 非正整數(shù)的數(shù)值作為參數(shù),會報錯 new Array(3.2) // RangeError: Invalid array length new Array(-3) // RangeError: Invalid array length // 單個非數(shù)值(比如字符串、布爾值、對象等)作為參數(shù), // 則該參數(shù)是返回的新數(shù)組的成員 new Array("abc") // ["abc"] new Array([1]) // [Array[1]] // 多參數(shù)時,所有參數(shù)都是返回的新數(shù)組的成員 new Array(1, 2) // [1, 2] new Array("a", "b", "c") // ["a", "b", "c"]
可以看到,Array作為構造函數(shù),行為很不一致。因此,不建議使用它生成新數(shù)組,直接使用數(shù)組字面量是更好的做法。
// bad var arr = new Array(1, 2); // good var arr = [1, 2];
注:ES6 引入了Array.of( )方法來解決這個問題。該方法的作用非常類似Array構造器,但在使用單個數(shù)值參數(shù)的時候并不會導致特殊結果。Array.of( )方法總會創(chuàng)建一個包含所有傳入?yún)?shù)的數(shù)組,而不管參數(shù)的數(shù)量與類型:
let items = Array.of(1, 2); console.log(items.length); // 2 console.log(items[0]); // 1 console.log(items[1]); // 2 items = Array.of(2); console.log(items.length); // 1 console.log(items[0]); // 2
Array.of基本上可以用來替代Array()或newArray(),并且不存在由于參數(shù)不同而導致的重載,而且他們的行為非常統(tǒng)一。
靜態(tài)方法 Array.isArray()Array.isArray方法返回一個布爾值,表示參數(shù)是否為數(shù)組。它可以彌補typeof運算符的不足。
var arr = [1, 2, 3]; typeof arr // "object" Array.isArray(arr) // true`Array.from()
ES6特性,將偽數(shù)組對象或可遍歷對象轉換為真數(shù)組。如果一個對象的所有鍵名都是正整數(shù)或零,并且有l(wèi)ength屬性,那么這個對象就很像數(shù)組,稱為偽數(shù)組。典型的偽數(shù)組有函數(shù)的arguments對象,以及大多數(shù) DOM 元素集,還有字符串。
ES6特性,
valueOf方法是一個所有對象都擁有的方法,表示對該對象求值。不同對象的valueOf方法不盡一致,數(shù)組的valueOf方法返回數(shù)組本身。
var arr = [1, 2, 3]; arr.valueOf() // [1, 2, 3]
toString方法也是對象的通用方法,數(shù)組的toString方法返回數(shù)組的字符串形式。
var arr = [1, 2, 3]; arr.toString() // "1,2,3" var arr = [1, 2, 3, [4, 5, 6]]; arr.toString() // "1,2,3,4,5,6"push()、pop()
push、pop均是在數(shù)組末尾進行增刪元素,都會改變原數(shù)組。push方法用于在數(shù)組的末端添加一個或多個元素,并返回添加新元素后的數(shù)組長度。pop方法用于刪除數(shù)組的最后一個元素,并返回該元素。
var arr = []; arr.push(1) // 1 arr.push("a") // 2 arr.push(true, {}) // 4 arr // [1, "a", true, {}] var arr = ["a", "b", "c"]; arr.pop() // "c" arr // ["a", "b"]
push和pop結合使用,就構成了“后進先出”的棧結構(stack)。
shift()、unshift()shift、unshift均是在數(shù)組頭進行增刪元素,都會改變原數(shù)組。shift()方法用于刪除數(shù)組的第一個元素,并返回該元素。unshift()方法用于在數(shù)組的第一個位置添加元素,并返回添加新元素后的數(shù)組長度。
var a = ["a", "b", "c"]; a.shift() // "a" a // ["b", "c"] var a = ["a", "b", "c"]; a.unshift("x"); // 4 a // ["x", "a", "b", "c"]
push()和shift()結合使用,就構成了“先進先出”的隊列結構(queue)。
join()join()方法以指定參數(shù)作為分隔符,將所有數(shù)組成員連接為一個字符串返回。如果不提供參數(shù),默認用逗號分隔。
var a = [1, 2, 3, 4]; a.join(" ") // "1 2 3 4" a.join(" | ") // "1 | 2 | 3 | 4" a.join() // "1,2,3,4"concat()
concat方法用于多個數(shù)組的合并。它將新數(shù)組的成員,添加到原數(shù)組成員的后部,然后返回一個新數(shù)組,原數(shù)組不變。
["hello"].concat(["world"]) // ["hello", "world"] ["hello"].concat(["world"], ["!"]) // ["hello", "world", "!"] [].concat({a: 1}, {b: 2}) // [{ a: 1 }, { b: 2 }] [2].concat({a: 1}) // [2, {a: 1}] [1, 2, 3].concat(4, 5, 6) // [1, 2, 3, 4, 5, 6]reverse()
reverse方法用于顛倒排列數(shù)組元素,返回改變后的數(shù)組。注意,該方法將改變原數(shù)組。
var a = ["a", "b", "c"]; a.reverse() // ["c", "b", "a"] a // ["c", "b", "a"]slice()、splice()
slice方法用于提取目標數(shù)組的一部分,返回一個新數(shù)組,原數(shù)組不變。
arr.slice(start, end);
它的第一個參數(shù)為起始位置(從0開始),第二個參數(shù)為終止位置(但該位置的元素本身不包括在內(nèi))。如果省略第二個參數(shù),則一直返回到原數(shù)組的最后一個成員。如果slice方法的參數(shù)是負數(shù),則表示倒數(shù)計算的位置。
var a = ["a", "b", "c"]; a.slice(0) // ["a", "b", "c"] a.slice(1) // ["b", "c"] a.slice(1, 2) // ["b"] a.slice(2, 6) // ["c"] a.slice() // ["a", "b", "c"] var a = ["a", "b", "c"]; a.slice(-2) // ["b", "c"] a.slice(-2, -1) // ["b"]
splice方法用于刪除原數(shù)組的一部分成員,并可以在刪除的位置添加新的數(shù)組成員,返回值是被刪除的元素。注意,該方法會改變原數(shù)組。
arr.splice(start, count, addElement1, addElement2, ...);
splice的第一個參數(shù)是刪除的起始位置(從0開始),第二個參數(shù)是被刪除的元素個數(shù)。如果后面還有更多的參數(shù),則表示這些就是要被插入數(shù)組的新元素。起始位置如果是負數(shù),就表示從倒數(shù)位置開始刪除。如果只是單純地插入元素,splice方法的第二個參數(shù)可以設為0。如果只提供第一個參數(shù),等同于將原數(shù)組在指定位置拆分成兩個數(shù)組。
var a = ["a", "b", "c", "d", "e", "f"]; a.splice(4, 2) // ["e", "f"] a // ["a", "b", "c", "d"] var a = ["a", "b", "c", "d", "e", "f"]; a.splice(4, 2, 1, 2) // ["e", "f"] a // ["a", "b", "c", "d", 1, 2] var a = ["a", "b", "c", "d", "e", "f"]; a.splice(-4, 2) // ["c", "d"] var a = [1, 1, 1]; a.splice(1, 0, 2) // [] a // [1, 2, 1, 1] var a = [1, 2, 3, 4]; a.splice(2) // [3, 4] a // [1, 2]sort()
sort方法對數(shù)組成員進行排序,默認是按照字典順序排序。排序后,原數(shù)組將被改變。
["d", "c", "b", "a"].sort() // ["a", "b", "c", "d"] [4, 3, 2, 1].sort() // [1, 2, 3, 4] [11, 101].sort() // [101, 11] [10111, 1101, 111].sort()
數(shù)值會被先轉成字符串,再按照字典順序進行比較,所以101排在11的前面。
如果想讓sort方法按照自定義方式排序,可以傳入一個函數(shù)作為參數(shù)。
[10111, 1101, 111].sort(function (a, b) { return a - b; }) // [111, 1101, 10111] [ { name: "張三", age: 30 }, { name: "李四", age: 24 }, { name: "王五", age: 28 } ].sort(function (o1, o2) { return o1.age - o2.age; }) // [ // { name: "李四", age: 24 }, // { name: "王五", age: 28 }, // { name: "張三", age: 30 } // ]map()、forEach()
map方法和forEach方法很相似,也是對數(shù)組的所有成員依次執(zhí)行參數(shù)函數(shù)。map方法將數(shù)組的所有成員依次傳入?yún)?shù)函數(shù),然后把每一次的執(zhí)行結果組成一個新數(shù)組返回。forEach方法不返回值,只用來操作數(shù)據(jù)。這就是說,如果數(shù)組遍歷的目的是為了得到返回值,那么使用map方法,否則使用forEach方法。
map、forEach方法接受一個函數(shù)作為參數(shù)。該函數(shù)調(diào)用時,map方法向它傳入三個參數(shù):當前成員、當前位置和數(shù)組本身。
[1, 2, 3].map(function(elem, index, arr) { return elem * index; }); // [0, 2, 6] function log(element, index, array) { console.log("[" + index + "] = " + element); } [2, 5, 9].forEach(log); // [0] = 2 // [1] = 5 // [2] = 9
上面代碼中,map、forEach方法的回調(diào)函數(shù)有三個參數(shù),elem為當前成員的值,index為當前成員的位置,arr為原數(shù)組([1, 2, 3])。map方法還可以接受第二個參數(shù),用來綁定回調(diào)函數(shù)內(nèi)部的this變量。
var arr = ["a", "b", "c"]; [1, 2].map(function (e) { return this[e]; }, arr) // ["b", "c"] var out = []; [1, 2, 3].forEach(function(elem) { this.push(elem * elem); }, out); out // [1, 4, 9]
map、forEach方法不會跳過undefined和null,但是會跳過空位。
注:forEach方法無法中斷執(zhí)行,總是會將所有成員遍歷完。如果希望符合某種條件時,就中斷遍歷,要使用for循環(huán)。
var arr = [1, 2, 3]; for (var i = 0; i < arr.length; i++) { if (arr[i] === 2) break; console.log(arr[i]); } // 1fliter
filter方法用于過濾數(shù)組成員,滿足條件的成員組成一個新數(shù)組返回。它的參數(shù)是一個函數(shù),所有數(shù)組成員依次執(zhí)行該函數(shù),返回結果為true的成員組成一個新數(shù)組返回。該方法不會改變原數(shù)組。
[1, 2, 3, 4, 5].filter(function (elem, index, arr) { return index % 2 === 0; }); // [1, 3, 5]
filter方法還可以接受第二個參數(shù),用來綁定參數(shù)函數(shù)內(nèi)部的this變量。
some(),every()返回一個布爾值,表示判斷數(shù)組成員是否符合某種條件。它們接受一個函數(shù)作為參數(shù),所有數(shù)組成員依次執(zhí)行該函數(shù)。該函數(shù)接受三個參數(shù):當前成員、當前位置和整個數(shù)組,然后返回一個布爾值。some方法是只要一個成員的返回值是true,則整個some方法的返回值就是true,否則返回false。
every方法是所有成員的返回值都是true,整個every方法才返回true,否則返回false。
var arr = [1, 2, 3, 4, 5]; arr.every(function (elem, index, arr) { return elem >= 3; }); // false
some和every方法還可以接受第二個參數(shù),用來綁定參數(shù)函數(shù)內(nèi)部的this變量。
indexOf(),lastIndexOf()indexOf方法返回給定元素在數(shù)組中第一次出現(xiàn)的位置,如果沒有出現(xiàn)則返回-1。indexOf方法還可以接受第二個參數(shù),表示搜索的開始位置。
var a = ["a", "b", "c"]; a.indexOf("b") // 1 a.indexOf("y") // -1 ["a", "b", "c"].indexOf("a", 1) // -1
lastIndexOf方法返回給定元素在數(shù)組中最后一次出現(xiàn)的位置
var a = [2, 5, 9, 2]; a.lastIndexOf(2) // 3 a.lastIndexOf(7) // -1find() 和 findIndex()
二者皆是ES6新特性,數(shù)組實例的find方法,用于找出第一個符合條件的數(shù)組成員。它的參數(shù)是一個回調(diào)函數(shù),所有數(shù)組成員依次執(zhí)行該回調(diào)函數(shù),直到找出第一個返回值為true的成員,然后返回該成員。如果沒有符合條件的成員,則返回undefined。
數(shù)組實例的findIndex方法的用法與find方法非常類似,返回第一個符合條件的數(shù)組成員的位置,如果所有成員都不符合條件,則返回-1。
[1, 4, -5, 10].find((n) => n < 0) // -5 [1, 5, 10, 15].findIndex(function(value, index, arr) { return value > 9; }) // 2includes()
ES6新特性,Array.prototype.includes方法返回一個布爾值,表示某個數(shù)組是否包含給定的值。該方法的第二個參數(shù)表示搜索的起始位置,默認為0。如果第二個參數(shù)為負數(shù),則表示倒數(shù)的位置,如果這時它大于數(shù)組長度(比如第二個參數(shù)為-4,但數(shù)組長度為3),則會重置為從0開始。
[1, 2, 3].includes(2) // true [1, 2, 3].includes(3, -1); // true [1, 2, 3, 5, 1].includes(1, 2); // true
沒有該方法之前,我們通常使用數(shù)組的indexOf方法,檢查是否包含某個值。indexOf方法有兩個缺點,一是不夠語義化,它的含義是找到參數(shù)值的第一個出現(xiàn)位置,所以要去比較是否不等于-1,表達起來不夠直觀。二是,它內(nèi)部使用嚴格相等運算符(===)進行判斷,這會導致對NaN的誤判。
[NaN].indexOf(NaN) // -1 [NaN].includes(NaN) // truereduce(),reduceRight()
reduce方法和reduceRight方法依次處理數(shù)組的每個成員,最終累計為一個值。它們的差別是,reduce是從左到右處理(從第一個成員到最后一個成員),reduceRight則是從右到左(從最后一個成員到第一個成員),其他完全一樣。
[1, 2, 3, 4, 5].reduce(function (a, b) { console.log(a, b); return a + b; }) // 1 2 // 3 3 // 6 4 // 10 5 //最后結果:15數(shù)組實例的 entries(),keys() 和 values()
ES6 提供entries(),keys()和values(),用于遍歷數(shù)組。它們都返回一個遍歷器對象,可以用for...of循環(huán)進行遍歷,唯一的區(qū)別是keys()是對鍵名的遍歷、values()是對鍵值的遍歷,entries()是對鍵值對的遍歷。
for (let index of ["a", "b"].keys()) { console.log(index); } // 0 // 1 for (let elem of ["a", "b"].values()) { console.log(elem); } // "a" // "b" for (let [index, elem] of ["a", "b"].entries()) { console.log(index, elem); } // 0 "a" // 1 "b"總結
push、pop、shift、unshift、reverse、splice、sort會改變原數(shù)據(jù),其余不會;
常見工具方法 字符串、類數(shù)組對象拼接Array.prototype.join.call("hello", "-") // "h-e-l-l-o" var obj = { 0: "a", 1: "b", length: 2 }; Array.prototype.join.call(obj, "-") // "a-b"類數(shù)組對象轉為數(shù)組
Array.prototype.slice.call({ 0: "a", 1: "b", length: 2 }) // ["a", "b"] Array.prototype.slice.call(document.querySelectorAll("div")); Array.prototype.slice.call(arguments);找出字符長度最長的數(shù)組成員
function findLongest(entries) { return entries.reduce(function (longest, entry) { return entry.length > longest.length ? entry : longest; }, ""); } findLongest(["aaa", "bb", "c"]) // "aaa"
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/101072.html
摘要:它主要用在以類數(shù)組對象和可迭代對象為藍本,創(chuàng)建對應的數(shù)組。類數(shù)組對象我們最熟悉的類數(shù)組對象,應該就是的對象了。 在ES6之前,創(chuàng)建數(shù)組的方式有2種:一: 通過數(shù)組字面量 let array = [1,2,3]; console.log(array);//[1,2,3] 二: 通過new Array()創(chuàng)建數(shù)組 let array = new Array(1, 2, 3); conso...
摘要:對象方法數(shù)組創(chuàng)建與修改創(chuàng)建創(chuàng)建一個新數(shù)組實例將類數(shù)組類似數(shù)組的對象和可遍歷的對象轉為真正的數(shù)組。返回一個新的對象,該對象包含數(shù)組每個索引的值。遍歷鍵遍歷值遍歷鍵值對參考文檔標準庫對象 Array 對象方法 數(shù)組創(chuàng)建與修改 1. 創(chuàng)建 var arr = []; var arr = new Array() Array.of(el1[,el2[...]]) //創(chuàng)建一個新數(shù)組實例 Ar...
摘要:數(shù)組學習記錄是的實例屬性。對數(shù)組元素進行排序,并返回當前數(shù)組。返回一個由所有數(shù)組元素組合而成的字符串。為數(shù)組中的每個元素執(zhí)行一次回調(diào)函數(shù)。返回一個數(shù)組迭代器對象,該迭代器會包含所有數(shù)組元素的鍵值對。 JavaScript數(shù)組學習記錄 Array.length Array.length 是Array的實例屬性。返回或設置一個數(shù)組中的元素個數(shù)。該值是一個無符號 32-bit 整數(shù),并且總是...
摘要:關于我的博客掘金專欄路易斯專欄原文鏈接深度長文數(shù)組全解密全文共字,系統(tǒng)講解了數(shù)組的各種特性和。構造器構造器用于創(chuàng)建一個新的數(shù)組。中聲明的數(shù)組,它的構造函數(shù)是中的對象。 本文首發(fā)于CSDN網(wǎng)站,下面的版本又經(jīng)過進一步的修訂。 關于 我的博客:louis blog 掘金專欄:路易斯專欄 原文鏈接:【深度長文】JavaScript數(shù)組全解密 全文共13k+字,系統(tǒng)講解了JavaScrip...
摘要:簡單總結一下的對象屬性數(shù)組指定創(chuàng)建一個數(shù)組的函數(shù)。方法數(shù)組返回一個迭代器,它返回數(shù)組的鍵值對。方法數(shù)組返回滿足回調(diào)函數(shù)中指定的測試條件的第一個數(shù)組元素的索引值。該回調(diào)函數(shù)的返回值為累積結果,并且此返回值在下一次調(diào)用該回調(diào)函數(shù)時作為參數(shù)提供。 簡單總結一下JS的Array對象 constructor 屬性(數(shù)組) 指定創(chuàng)建一個數(shù)組的函數(shù)。該屬性可用于判斷某個對象是否為數(shù)組與arr ins...
作者:陳大魚頭 github: KRISACHAN 背景 在最近的項目中,有這么一個功能點,就是要獲取在WEB IDE里用戶所寫的注釋中的一段特殊規(guī)則,然后解析成一段JS config 對象 例如: //% width=100px height=200px //% pos.top=50px pos.left=50px //% writable=true //% q.b.d.w.r.f=30...
閱讀 4607·2021-09-26 09:55
閱讀 1352·2019-12-27 12:16
閱讀 879·2019-08-30 15:56
閱讀 1895·2019-08-30 14:05
閱讀 983·2019-08-30 13:05
閱讀 1261·2019-08-30 10:59
閱讀 1437·2019-08-26 16:19
閱讀 1880·2019-08-26 13:47