-
Array -MDN
window.Array 全局對象(也是函數(shù))-
基本用法:
var a = Array(3) // {length: 3} a.length // 3 0 in a // false, 數(shù)組 a 里面并沒有 0 這個 key a[0] // undefined a.push('three') 3 in a // true a[3] // 'three'
var a2 = Array(3,3) // [3,3] a2.length // 2 0 in a2 // true a2[0] // 3 // 當(dāng)括號里只有一個數(shù)字參數(shù)的時候莫杈,它是長度,當(dāng)參數(shù)不止一個的時候它是參數(shù) // 這叫做不一致性跷究,這不是一件好事
new Array(3) 跟不加 new 一樣的效果 new Array(3,3,) 跟不加 new 一樣的效果 var a = [1,2,3] // 常用簡寫方式
-
加不加
new
對不同類型的區(qū)別:-
String姓迅、Number、Boolean
String()
返回基本類型
new String()
返回對象 -
Object俊马、Array丁存、Function
Object()
返回對象
new Object()
返回依然是對象
-
-
數(shù)組為什么是數(shù)組而不是對象是因?yàn)閿?shù)組有著對象沒有的特點(diǎn)
也就是你的對象的__proto__
指向的是否是Array.prototype
-
數(shù)組的一個特征
數(shù)組之所以是數(shù)組,其實(shí)是因?yàn)槟惆阉鼣?shù)組var a = [1,2,3] a.x = 'x' a.y = 'y' for(let i=0; i < a.length; i++){ // 這種方法遍歷排除了 x柴我、y console.log(a[i]) // 1, 2, 3 } for(let key in a){ console.log(key) // 0, 1, 2, x, y } var obj = { 0: 1, 1: 2, 2: 3, length: 3 } for(let i=0; i < obj.length; i++){ console.log(obj[i]) // 1, 2, 3 }
-
偽數(shù)組
上面的obj
對象就是偽數(shù)組解寝;它不關(guān)心你有沒有數(shù)組的那些方法,只需要012345……這些下標(biāo)去遍歷
只要你的原型鏈中沒有Array.prototype
就是偽數(shù)組
目前JS中只有一種偽數(shù)組艘儒,就是arguments
function f(){ console.dir(arguments) } f(1,2,3)
從下圖可以看見它引用的是
Object.protype
而非Array.prototype
-
forEach
API -MDN阮一峰
forEach() 方法對數(shù)組的每個元素執(zhí)行一次提供的函數(shù)聋伦。
語法:array.forEach(callback(currentValue, index, array){ //do something }, this) array.forEach(callback[, thisArg]) // Eg const arr = ['a', 'b', 'c']; arr.forEach(function(element) { console.log(element); }); arr.forEach( element => console.log(element)); // a // b // c // 上面我們并沒有將arr傳進(jìn)forEach里面但是為什么還能調(diào)用 // 可以這么理解 // 用this來獲取夫偶,比如 var obj = { 0:'a', 1:'b', length:2 } obj.forEach = function(fn){ for(let i=0; i < this.length; i++){ fn(this[i], i, this) } }
參數(shù):
callback
為數(shù)組中每個元素執(zhí)行的函數(shù),該函數(shù)接收三個參數(shù):
currentValue
(當(dāng)前值)
數(shù)組中正在處理的當(dāng)前元素觉增。
index
(索引)
數(shù)組中正在處理的當(dāng)前元素的索引兵拢。
array
forEach()
方法正在操作的數(shù)組。
thisArg
可選
可選參數(shù)逾礁。當(dāng)執(zhí)行回調(diào) 函數(shù)時用作this的值(參考對象)说铃。
返回值:undefined
. -
sort()
-MDN阮一峰
sort方法對數(shù)組成員進(jìn)行排序,默認(rèn)排序順序是根據(jù)字符串Unicode碼點(diǎn)嘹履。 sort 排序不一定是穩(wěn)定的排序后腻扇,原數(shù)組將被改變。['d', 'c', 'b', 'a'].sort() // ['a', 'b', 'c', 'd'] [4, 3, 2, 1].sort() // [1, 2, 3, 4] var fruit = ['cherries', 'apples', 'bananas']; fruit.sort(); // ['apples', 'bananas', 'cherries'] var scores = [1, 10, 21, 2]; scores.sort(); // [1, 10, 2, 21] // 注意10在2之前, // 因?yàn)樵?Unicode 指針順序中"10"在"2"之前 var things = ['word', 'Word', '1 Word', '2 Words']; things.sort(); // ['1 Word', '2 Words', 'Word', 'word'] // 在Unicode中, 數(shù)字在大寫字母之前, // 大寫字母在小寫字母之前.
語法:
arr.sort()
arr.sort(compareFunction)
參數(shù):
compareFunction
可選砾嫉。用來指定按某種順序進(jìn)行排列的函數(shù)幼苛。如果省略,元素按照轉(zhuǎn)換為的字符串的各個字符的Unicode位點(diǎn)進(jìn)行排序焕刮。
返回值: 返回排序后的數(shù)組舶沿。原數(shù)組已經(jīng)被排序后的數(shù)組代替。
描述:
如果沒有指明compareFunction
济锄,那么元素會按照轉(zhuǎn)換為的字符串的諸個字符的 Unicode 位點(diǎn)進(jìn)行排序暑椰。例如 "Banana" 會被排列到 "cherry" 之前霍转。當(dāng)數(shù)字按由小到大排序時荐绝,9 出現(xiàn)在 80 之前,但因?yàn)椋]有指明compareFunction
)避消,比較的數(shù)字會先被轉(zhuǎn)換為字符串低滩,所以在Unicode順序上 "80" 要比 "9" 要靠前。
如果指明了compareFunction
岩喷,那么數(shù)組會按照調(diào)用該函數(shù)的返回值排序恕沫。即 a 和 b 是兩個將要被比較的元素:- 如果
compareFunction(a, b)
小于 0 ,那么 a 會被排列到 b 之前纱意; - 如果
compareFunction(a, b)
大于 0 婶溯, b 會被排列到 a 之前 - 如果
compareFunction(a, b)
等于 0 , a 和 b 的相對位置不變 -
compareFunction(a, b)
必須總是對相同的輸入返回相同的比較結(jié)果偷霉,否則排序的結(jié)果將是不確定的迄委。
// 對數(shù)字排序 var a = [5,6,4,1,2,3] // 升序 function up(a, b) { if (a < b ) { // 按某種排序標(biāo)準(zhǔn)進(jìn)行比較, a 小于 b return -1; } if (a > b ) { return 1; } // a must be equal to b return 0; } // 更簡潔的寫法 function up(a,b){ return a-b } a.sort(up) // 1,2,3,4,5,6 // 降序 function down(a,b){ return b-a }
js內(nèi)置的排序一般都是快排
- 如果
-
join()
-MDN
join() 方法將一個數(shù)組(或一個類數(shù)組對象)的所有元素連接成一個字符串并返回這個字符串。
和sort()方法不同类少,它不會改變原有的數(shù)組
語法:str = arr.join() // 默認(rèn)為 "," str = arr.join("") // 分隔符 === 空字符串 "" str = arr.join(separator) // 分隔符
參數(shù):
separator
指定一個字符串來分隔數(shù)組的每個元素叙身。
如果需要(separator
),將分隔符轉(zhuǎn)換為字符串硫狞。
如果省略()信轿,數(shù)組元素用逗號分隔晃痴。默認(rèn)為 ","。
如果separator是空字符串("")财忽,則所有元素之間都沒有任何字符倘核。
返回值
一個所有數(shù)組元素連接的字符串。如果 arr.length 為0即彪,則返回空字符串// Eg let a = ['Wind', 'Rain', 'Fire']; console.log(a.join()); // 默認(rèn)為 "," // 'Wind,Rain,Fire' console.log(a.join("")); // 分隔符 === 空字符串 "" // "WindRainFire" console.log(a.join("-")); // 分隔符 "-" // 'Wind-Rain-Fire'
-
concat()
-MDN
concat() 方法用于合并兩個或多個數(shù)組笤虫。此方法不會更改現(xiàn)有數(shù)組,而是返回一個新數(shù)組祖凫。
語法:
var new_array = old_array.concat(value1[, value2[, ...[, valueN]]])
參數(shù):valueN
將數(shù)組和/或值連接成新數(shù)組琼蚯。
返回值:新的 Array 實(shí)例。var arr1 = ['a', 'b', 'c']; var arr2 = ['d', 'e', 'f']; var arr3 = arr1.concat(arr2); // arr3 is a new array [ "a", "b", "c", "d", "e", "f" ] // 使用 concat 來復(fù)制一個數(shù)組 var a = [1,2,3] bar b = a.concat([]) a === b // false
-
map()
-MDN阮一峰
map() 方法創(chuàng)建一個新數(shù)組惠况,其結(jié)果是該數(shù)組中的每個元素都調(diào)用一個提供的函數(shù)后返回的結(jié)果遭庶。
map與forEach類似,不同的是它返回一個新數(shù)組稠屠,而forEach返回undefined峦睡。
語法:let new_array = arr.map(function callback(currentValue, index, array) { // Return element for new_array }[, thisArg]) // Eg var numbers = [1, 2, 3]; numbers.map(function (n) { return n + 1; }); // [2, 3, 4] numbers // [1, 2, 3]
參數(shù):
callback
生成新數(shù)組元素的函數(shù),使用三個參數(shù):
currentValue
callback 的第一個參數(shù)权埠,數(shù)組中正在處理的當(dāng)前元素榨了。
index
callback 的第二個參數(shù),數(shù)組中正在處理的當(dāng)前元素的索引攘蔽。
array
callback 的第三個參數(shù)龙屉,map 方法被調(diào)用的數(shù)組。
thisArg
可選的满俗。執(zhí)行 callback 函數(shù)時 使用的this 值转捕。
返回值:
一個新數(shù)組,每個元素都是回調(diào)函數(shù)的結(jié)果唆垃。 -
filter()
-MDN
filter() 方法創(chuàng)建一個新數(shù)組, 其包含通過所提供函數(shù)實(shí)現(xiàn)的測試的所有元素五芝。
語法:
var new_array = arr.filter(callback[, thisArg])
返回值: 一個新的通過測試的元素的集合的數(shù)組
ES6:
let [...spread]= [12, 5, 8, 130, 44];
等同于:let spread = 淺克隆([12, 5, 8, 130, 44])function isBigEnough(value) { return value >= 10; } var filtered = [12, 5, 8, 130, 44].filter(isBigEnough); // filtered is [12, 130, 44] // ES6 way const isBigEnough = value => value >= 10; // 這里用的箭頭函數(shù) let [...spread]= [12, 5, 8, 130, 44]; let filtered = spread.filter(isBigEnough); // filtered is [12, 130, 44]
-
reduce()
-MDN
reduce() 方法對累加器和數(shù)組中的每個元素(從左到右)應(yīng)用一個函數(shù),將其減少為單個值辕万。
語法:arr.reduce(callback(accumulator,currentValue)[, initialValue])
參數(shù)
callback
執(zhí)行數(shù)組中每個值的函數(shù)枢步,包含四個參數(shù):
accumulator
累加器累加回調(diào)的返回值; 它是上一次調(diào)用回調(diào)時返回的累積值,或initialValue(如下所示)渐尿。currentValue
數(shù)組中正在處理的元素醉途。
currentIndex
數(shù)組中正在處理的當(dāng)前元素的索引。 如果提供了initialValue涡戳,則索引號為0结蟋,否則為索引為1。
array
調(diào)用reduce的數(shù)組
initialValue
可選,用作第一個調(diào)用callback的第一個參數(shù)的值渔彰。 如果沒有提供初始值嵌屎,則將使用數(shù)組中的第一個元素推正。在沒有初始值的空數(shù)組上調(diào)用 reduce 將報錯。
返回值: 函數(shù)累計處理的結(jié)果var total = [0, 1, 2, 3].reduce(function(sum, value) { return sum + value; }, 0); // total is 6 var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) { return a.concat(b); }, []); // flattened is [0, 1, 2, 3, 4, 5] // 使用 reduce 表示 map var a = [1,2,3] a.map(function(value){ return value * 2 }) a.reduce(function(arr, n){ arr.push(n*2) return arr }, []) // 使用 reduce 表示 filter var b = [1,2,3,4,5,6,7,8,9,10] b.filter(function(value){ return value % 2 === 0 }) b.reduce(function(arr, n){ if(n % 2 === 0){ arr.push(n) } reruen arr },[])
-
-
Function -MDN
// 常用簡寫方式 var f = function(a,b){ return a+b } var f = new Function('a', 'b', 'return a+b') //使用 new 進(jìn)行構(gòu)造宝惰, var f = new Function(['a','b'],'return a+b')
語法:
new Function ([arg1[, arg2[, ...argN]],] functionBody)
參數(shù):
arg1, arg2, ... argN
被函數(shù)使用的參數(shù)的名稱必須是合法命名的植榕。參數(shù)名稱是一個有效的JavaScript標(biāo)識符的字符串,或者一個用逗號分隔的有效字符串的列表;例如“×”尼夺,“theValue”尊残,或“A,B”淤堵。
functionBody
一個含有包括函數(shù)定義的JavaScript語句的字符串函數(shù)總是會返回一個值
function fn(){ console.log('函數(shù)') return undefined // 如果你不寫就會自動添加這樣的一句 }