摘要:上面代碼通過方法的第二個參數(shù),將回調(diào)函數(shù)內(nèi)部的對象,指向數(shù)組。第三次執(zhí)行,為上一輪的返回值,為第四個成員。第四次執(zhí)行,為上一輪返回值,為第五個成員。
Array 對象
構(gòu)造函數(shù)
靜態(tài)方法
Array.isArray()
實例方法
valueOf(),toString()
push(),pop()
shift(),unshift()
join(分隔符)返回字符串
concat()新的
reverse()
slice(頭尾)新的
splice(頭,長,增)增(頭,0,增)拆成兩個(頭)返回刪除的
sort()
map()新的 this
forEach()不返回 this
filter()新的 返回ture的
some(),every()新的 返turee false
reduce(),reduceRight()新的
indexOf(),lastIndexOf()新的
鏈?zhǔn)绞褂?/p>
1.構(gòu)造函數(shù)
Array構(gòu)造函數(shù)有一個很大的缺陷,就是不同的參數(shù),會導(dǎo)致它的行為不一致。
// 無參數(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"]
// bad
var arr = new Array(1, 2);
// good
var arr = [1, 2];
var a = new Array(3);
var b = [undefined, undefined, undefined];
a.length // 3
b.length // 3
a[0] // undefined
b[0] // undefined
0 in a // false
0 in b // true
2.靜態(tài)方法
Array.isArray()
var arr = [1, 2, 3];
typeof arr // "object"
Array.isArray(arr) // true
3.實例方法
3.1valueOf()原數(shù)組,toString()字符串
3.2push(),pop() 改
3.3shift(),unshift()改
shift()方法可以遍歷并清空一個數(shù)組。
var list = [1, 2, 3, 4];
var item;
while (item = list.shift()) {
console.log(item);
}
list // []
上面代碼通過list.shift()方法每次取出一個元素,從而遍歷數(shù)組。它的前提是數(shù)組元素不能是0或任何布爾值等于false的元素,因此這樣的遍歷不是很可靠
3.4join(分隔符)字符串
如果數(shù)組成員是undefined或null或空位,會被轉(zhuǎn)成空字符串。
[undefined, null].join("#")
// "#"
["a",, "b"].join("-")
// "a--b"
通過call方法,這個方法也可以用于字符串或類似數(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"
3.5concat()新
concat方法返回當(dāng)前數(shù)組的一個淺拷貝。所謂“淺拷貝”,指的是新數(shù)組拷貝的是對象的引用。
var obj = { a: 1 };
var oldArray = [obj];
var newArray = oldArray.concat();
obj.a = 2;
newArray[0].a // 2
上面代碼中,原數(shù)組包含一個對象,concat方法生成的新數(shù)組包含這個對象的引用。所以,改變原對象以后,新數(shù)組跟著改變
3.6reverse()改
3.7slice(頭,尾)新
slice方法的一個重要應(yīng)用,是將類似數(shù)組的對象轉(zhuǎn)為真正的數(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);
3.8splice(頭,長,增) 只插入(頭,0,增)
起始位置如果是負(fù)數(shù),就表示從倒數(shù)位置開始刪除。
var a = ["a", "b", "c", "d", "e", "f"];
a.splice(-4, 2) // ["c", "d"]
上面代碼表示,從倒數(shù)第四個位置c開始刪除兩個成員。
如果只是單純地插入元素,splice方法的第二個參數(shù)可以設(shè)為0。
var a = [1, 1, 1];
a.splice(1, 0, 2) // []
a // [1, 2, 1, 1]
如果只提供第一個參數(shù),等同于將原數(shù)組在指定位置拆分成兩個數(shù)組。
var a = [1, 2, 3, 4];
a.splice(2) // [3, 4]
a // [1, 2]
3.9sort()改
數(shù)值會被先轉(zhuǎn)成字符串,再按照字典順序進(jìn)行比較,所以101排在11的前面。
如果想讓sort方法按照自定義方式排序,可以傳入一個函數(shù)作為參數(shù)。
[10111, 1101, 111].sort(function (a, b) {
return a - b;
})
// [111, 1101, 10111]
上面代碼中,sort的參數(shù)函數(shù)本身接受兩個參數(shù),表示進(jìn)行比較的兩個數(shù)組成員。如果該函數(shù)的返回值大于0,表示第一個成員排在第二個成員后面;其他情況下,都是第一個元素排在第二個元素前面。
[
{ 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 }
// ]
3.10map()新
[1, 2, 3].map(function(elem, index, arr) {
return elem * index;
});
// [0, 2, 6]
上面代碼中,map方法的回調(diào)函數(shù)有三個參數(shù),elem為當(dāng)前成員的值,index為當(dāng)前成員的位置,arr為原數(shù)組([1, 2, 3])。
map方法還可以接受第二個參數(shù),用來綁定回調(diào)函數(shù)內(nèi)部的this變量(詳見《this 變量》一章)。
var arr = ["a", "b", "c"];
[1, 2].map(function (e) {
return this[e];
}, arr)
// ["b", "c"]
上面代碼通過map方法的第二個參數(shù),將回調(diào)函數(shù)內(nèi)部的this對象,指向arr數(shù)組。
如果數(shù)組有空位,map方法的回調(diào)函數(shù)在這個位置不會執(zhí)行,會跳過數(shù)組的空位。
var f = function (n) { return "a" };
[1, undefined, 2].map(f) // ["a", "a", "a"]
[1, null, 2].map(f) // ["a", "a", "a"]
[1, , 2].map(f) // ["a", , "a"]
上面代碼中,map方法不會跳過undefined和null,但是會跳過空位。
3.11forEach()
forEach方法不返回值,只用來操作數(shù)據(jù)。這就是說,如果數(shù)組遍歷的目的是為了得到返回值,那么使用map方法,否則使用forEach方法
function log(element, index, array) {
console.log("[" + index + "] = " + element);
}
[2, 5, 9].forEach(log);
// [0] = 2
// [1] = 5
// [2] = 9
forEach方法也可以接受第二個參數(shù),綁定參數(shù)函數(shù)的this變量。
var out = [];
[1, 2, 3].forEach(function(elem) {
this.push(elem * elem);
}, out);
out // [1, 4, 9]
上面代碼中,空數(shù)組out是forEach方法的第二個參數(shù),結(jié)果,回調(diào)函數(shù)內(nèi)部的this關(guān)鍵字就指向out。
forEach方法也會跳過數(shù)組的空位。
var log = function (n) {
console.log(n + 1);
};
[1, undefined, 2].forEach(log)
// 2
// NaN
// 3
[1, null, 2].forEach(log)
// 2
// 1
// 3
[1, , 2].forEach(log)
// 2
// 3
3.12filter()
[1, 2, 3, 4, 5].filter(function (elem) {
return (elem > 3);
})
// [4, 5]
上面代碼將大于3的數(shù)組成員,作為一個新數(shù)組返回。
var arr = [0, 1, "a", false];
arr.filter(Boolean)
// [1, "a"]
上面代碼中,filter方法返回數(shù)組arr里面所有布爾值為true的成員
[1, 2, 3, 4, 5].filter(function (elem, index, arr) {
return index % 2 === 0;
});
// [1, 3, 5]
filter方法還可以接受第二個參數(shù),用來綁定參數(shù)函數(shù)內(nèi)部的this變量。
var obj = { MAX: 3 };
var myFilter = function (item) {
if (item > this.MAX) return true;
};
var arr = [2, 8, 3, 4, 1, 3, 2, 9];
arr.filter(myFilter, obj) // [8, 4, 9
3.13some(),every()
判斷數(shù)組成員是否符合某種條件
some方法是只要一個成員的返回值是true,則整個some方法的返回值就是true,否則返回false
var arr = [1, 2, 3, 4, 5];
arr.some(function (elem, index, arr) {
return elem >= 3;
});
// true
上面代碼中,如果數(shù)組arr有一個成員大于等于3,some方法就返回true。
every方法是所有成員的返回值都是true,整個every方法才返回true,否則返回false。
var arr = [1, 2, 3, 4, 5];
arr.every(function (elem, index, arr) {
return elem >= 3;
});
// false
上面代碼中,數(shù)組arr并非所有成員大于等于3,所以返回false。
注意,對于空數(shù)組,some方法返回false,every方法返回true,回調(diào)函數(shù)都不會執(zhí)行。
function isEven(x) { return x % 2 === 0 }
[].some(isEven) // false
[].every(isEven) // true
some和every方法還可以接受第二個參數(shù),用來綁定參數(shù)函數(shù)內(nèi)部的this變量。
3.14reduce(),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
//最后結(jié)果:15
上面代碼中,reduce方法求出數(shù)組所有成員的和。第一次執(zhí)行,a是數(shù)組的第一個成員1,b是數(shù)組的第二個成員2。第二次執(zhí)行,a為上一輪的返回值3,b為第三個成員3。第三次執(zhí)行,a為上一輪的返回值6,b為第四個成員4。第四次執(zhí)行,a為上一輪返回值10,b為第五個成員5。至此所有成員遍歷完成,整個方法的返回值就是最后一輪的返回值15。
reduce方法和reduceRight方法的第一個參數(shù)都是一個函數(shù)。該函數(shù)接受以下四個參數(shù)。
累積變量,默認(rèn)為數(shù)組的第一個成員
當(dāng)前變量,默認(rèn)為數(shù)組的第二個成員
當(dāng)前位置(從0開始)
原數(shù)組
這四個參數(shù)之中,只有前兩個是必須的,后兩個則
如果要對累積變量指定初值,可以把它放在reduce方法和reduceRight方法的第二個參數(shù)。
[1, 2, 3, 4, 5].reduce(function (a, b) {
return a + b;
}, 10);
// 25
上面代碼指定參數(shù)a的初值為10,所以數(shù)組從10開始累加,最終結(jié)果為25。注意,這時b是從數(shù)組的第一個成員開始遍歷
上面的第二個參數(shù)相當(dāng)于設(shè)定了默認(rèn)值,處理空數(shù)組時尤其有用。
function add(prev, cur) {
return prev + cur;
}
[].reduce(add)
// TypeError: Reduce of empty array with no initial value
[].reduce(add, 1)
// 1
上面代碼中,由于空數(shù)組取不到初始值,reduce方法會報錯。這時,加上第二個參數(shù),就能保證總是會返回一個值
下面是一個reduceRight方法的例子。
function subtract(prev, cur) {
return prev - cur;
}
[3, 2, 1].reduce(subtract) // 0
[3, 2, 1].reduceRight(subtract) // -4
上面代碼中,reduce方法相當(dāng)于3減去2再減去1,reduceRight方法相當(dāng)于1減去2再減去3。
由于這兩個方法會遍歷數(shù)組,所以實際上還可以用來做一些遍歷相關(guān)的操作。比如,找出字符長度最長的數(shù)組成員。
function findLongest(entries) {
return entries.reduce(function (longest, entry) {
return entry.length > longest.length ? entry : longest;
}, "");
}
findLongest(["aaa", "bb", "c"]) // "aaa"
上面代碼中,reduce的參數(shù)函數(shù)會將字符長度較長的那個數(shù)組成員,作為累積值。這導(dǎo)致遍歷所有成員之后,累積值就是字符長度最長的那個成員。
3.15indexOf(),lastIndexOf()
3.16鏈?zhǔn)绞褂?/p>
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/105939.html
摘要:它主要用在以類數(shù)組對象和可迭代對象為藍(lán)本,創(chuàng)建對應(yīng)的數(shù)組。類數(shù)組對象我們最熟悉的類數(shù)組對象,應(yīng)該就是的對象了。 在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ù)組的對象和可遍歷的對象轉(zhuǎn)為真正的數(shù)組。返回一個新的對象,該對象包含數(shù)組每個索引的值。遍歷鍵遍歷值遍歷鍵值對參考文檔標(biāo)準(zhǔn)庫對象 Array 對象方法 數(shù)組創(chuàng)建與修改 1. 創(chuàng)建 var arr = []; var arr = new Array() Array.of(el1[,el2[...]]) //創(chuàng)建一個新數(shù)組實例 Ar...
摘要:數(shù)組學(xué)習(xí)記錄是的實例屬性。對數(shù)組元素進(jìn)行排序,并返回當(dāng)前數(shù)組。返回一個由所有數(shù)組元素組合而成的字符串。為數(shù)組中的每個元素執(zhí)行一次回調(diào)函數(shù)。返回一個數(shù)組迭代器對象,該迭代器會包含所有數(shù)組元素的鍵值對。 JavaScript數(shù)組學(xué)習(xí)記錄 Array.length Array.length 是Array的實例屬性。返回或設(shè)置一個數(shù)組中的元素個數(shù)。該值是一個無符號 32-bit 整數(shù),并且總是...
摘要:關(guān)于我的博客掘金專欄路易斯專欄原文鏈接深度長文數(shù)組全解密全文共字,系統(tǒng)講解了數(shù)組的各種特性和。構(gòu)造器構(gòu)造器用于創(chuàng)建一個新的數(shù)組。中聲明的數(shù)組,它的構(gòu)造函數(shù)是中的對象。 本文首發(fā)于CSDN網(wǎng)站,下面的版本又經(jīng)過進(jìn)一步的修訂。 關(guān)于 我的博客:louis blog 掘金專欄:路易斯專欄 原文鏈接:【深度長文】JavaScript數(shù)組全解密 全文共13k+字,系統(tǒng)講解了JavaScrip...
摘要:簡單總結(jié)一下的對象屬性數(shù)組指定創(chuàng)建一個數(shù)組的函數(shù)。方法數(shù)組返回一個迭代器,它返回數(shù)組的鍵值對。方法數(shù)組返回滿足回調(diào)函數(shù)中指定的測試條件的第一個數(shù)組元素的索引值。該回調(diào)函數(shù)的返回值為累積結(jié)果,并且此返回值在下一次調(diào)用該回調(diào)函數(shù)時作為參數(shù)提供。 簡單總結(jié)一下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...
閱讀 3999·2021-09-24 10:24
閱讀 1397·2021-09-22 16:01
閱讀 2718·2021-09-06 15:02
閱讀 1020·2019-08-30 13:01
閱讀 1008·2019-08-30 10:52
閱讀 636·2019-08-29 16:36
閱讀 2237·2019-08-29 12:51
閱讀 2338·2019-08-28 18:29