JS 里的數(shù)組

數(shù)組用法

在說數(shù)組的用法前先研究下string的用法和加new的用法

var s = String(1)  //  1
var s = new String(1)// { "1" }

由此可見,直接使用和new的區(qū)別是:沒有new會把內容變成字符串或者數(shù)字,后者有new會把傳入的內容變成對象。因為numer和boolean也是和string一樣是基本類型,用法相同。

var a = Array(3)   //3 , 是長度
var a = Array(3,3)  //不一致性   3是數(shù)組的一個數(shù)
var a = new Array(3) 
var a = new  Array(3,3)

加不加new對new不影響

var f =  Function('a','b','return a + b')
f(1,2)   // 3
var f = new Function('a','b','return a + b')
f(1,2)   //3

函數(shù)加不加也一樣

得出總結:在七種數(shù)據(jù)類型中,分為number string Boolean 基本類型和 object對象(包括array,function)兩類。
第一類不加new就是基本類型,加了new就變成對象; 第二類的object加不加new都是對象,不受new影響。

加不加new的影響

循環(huán)數(shù)組和偽數(shù)組的方法

覺得是數(shù)組就用

  for( i = 0 ; i < xx.length ; i++ ){ 
    console.log(xxx[i])   
  }  

覺得不是數(shù)組就用

  for ( let key in xx){ 
    console.log(key) 
  }

第一個用來循環(huán)數(shù)組,第二個用來循環(huán)偽數(shù)組

數(shù)組的本質__proto__(原型鏈)指向Array.prototype的對象 就是數(shù)組
偽數(shù)組 __proto__(原型鏈)中沒有指向Array.prototype 就是偽數(shù)組

API

forEach

forEach 接受函數(shù),函數(shù)必須接受兩個參數(shù) value和key

var  a = ['a','b','c'];
a.forEach(function(value,key){
    console.log(value,key)
})  
// a 0
// b 1
// c 2

說明:在數(shù)組a上面遍歷每一項,在每一項上面調用函數(shù),在調用函數(shù)的時候傳value和key。
a.forEach( function (){})等價于a.forEach.call( a , function(){}) 其實forEach有一個隱含的第一個參數(shù)this,但是這個參數(shù)不用傳,
函數(shù)的最后一句永遠有一句 return undefined,即使不寫瀏覽器也會自動加上去,這就解釋了為什么我們在控制臺console.log的時候回在敲完代碼出現(xiàn)undefined的原因 (這里提一下,后面函數(shù)的文章里有call,arguments),arguments就是函數(shù)在執(zhí)行的時候接收到的參數(shù)

sort

sort接受一個函數(shù),函數(shù)必須接受兩個參數(shù) ,兩個參數(shù)是左邊的數(shù)和右邊的數(shù),兩個數(shù)比較的正負來排序
例1

a = [5,6,2,4,7]
a.sort( function(x,y){return x-y}) // [2, 4, 5, 6, 7]  
a.sort( function(x,y){return y-x}) // [7, 6, 5, 4, 2]

例2
排序字符串的數(shù)組,可以給這個數(shù)組hash一個對應的數(shù)組來排序

a = ['馬云','馬化騰','李彥宏']
hash  = {
    '馬云':200.28,
    '馬化騰':465.2,
    '李彥宏':262.39
}
a.sort( function(x,y){ return hash[x] - hash[y]} )  // ["馬云", "李彥宏", "馬化騰"]
a.sort( function(x,y){ return hash[y] - hash[x]} )  // ["馬化騰", "李彥宏", "馬云"]

只有sort改變了原值
這里用了內置的排序:快排--nlogn,一般都是用快排

join

join默認不傳參就以逗號隔開,參數(shù)也可自己加

a = [1,2,3]
a.join('xiaozhi')  //"1xiaozhi2xiaozhi3"
a.join()    //  "1,2,3"

join其實是吧數(shù)組變字符串,其實是調用了a的toString()方法
a.toString() // "1,2,3"

concat

a = [1,2,3]
b = [4,5,6]
a.concat(b)  //  [1, 2, 3, 4, 5, 6]
a  // [1, 2, 3]
b  // [4, 5, 6]

原數(shù)組不變

a = [1,2,3]
var b  = a.concat([])   // [1, 2, 3]
a === b   // false

concat會返回一個新的數(shù)組

map

map和forEach差不多,但是forEach沒有返回值 ,map把返回的值收集起來

a = [1,2,3]
a.forEach( function(){} )   //undefined
a.map( function(value,key){
    return value*2
} )  //[2, 4, 6]   

map簡寫成箭頭函數(shù) a.map( value => value*2 ) // [2, 4, 6]

filter

function必須接受value和key

a = [1,2,3,4,5,6,7,8,9]
a.filter(function(value,key){
    return value>=5
})  // [5, 6, 7, 8, 9] 
a.filter(function(value,key){
    return value % 2 === 0 
})  // [2, 4, 6, 8] 

filter和map組合

a.filter(function(value,key){
    return value % 2 === 0 
}).map(function(value){
    return value * value
})  // [4, 16, 36, 64]

reduce

第一個參數(shù)作為 函數(shù),最后一個參數(shù)給一個初始值 ,函數(shù)必須接受兩個參數(shù) 第一個參數(shù)是之前傳sum,第二個是n

a = [1,2,3,4,5,6,7,8,9]
a.reduce( function(sum , n){
    return sum + n
},0 )   //45

reduce大招

map可以用reduce表示

a = [1,2,3]
a.reduce(function(arr,n){
    arr.push(n*2)
    return arr
},[])    //  [2, 4, 6]

filter可以用reduce表示

a = [1,2,3,4,5,6,7,8,9]
a.reduce(function(arr,n){
    if(n % 2 === 0){
        arr.push(n)
    }
    return arr
},[])   // [2, 4, 6, 8]

reduce調用reduce

a = [1,2,3,4,5]
a.reduce(function(arr,n){
    arr.push(n*2)
    return arr
},[]).reduce(function(arr,n){
    if (n>5){
        arr.push(n)
    }
    return arr
},[])  //[6, 8, 10]

其實會了reduce,map和filter就是reduce的特例而已。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容