在阮一峰的《JavaScript 标准参考教程(alpha)》中的解释是:
数组(array)是按次序排列的一组值。每一个值的位置都有编号(从0开始),整个数组用方括号表示。
JS的本质理解是:
数组(array)就是原型链中有 Array.prototype 的对象算法
var a = Array(3) // {length:3} var a = new Array(3) // {length:3}
若是输入只有一个数字,那么建立的数组就是length为3,而且三个数的值都为undefinde。new加不加效果都同样数组
var b = Array(3,3) // [3,3] var b = new Array(3,3) // [3,3]
若是输入的值超过一个,那么建立的就是一个value等于输入值的数组。new加不加效果都同样函数
var a = [,,,]//{length:3},值为undefined var a = [3,3]//[3,3]
建立数组也能够像这样直接建立,只有逗号的话表明的就是有下标可是值为undefined的数。学习
这样的对象就是伪数组测试
目前学习到的伪数组例如:this
forEach()接收一个函数,而且forEach()方法对数组的每一个元素执行一次提供的函数。prototype
array.forEach(callback(currentValue, index, array){ //do something }) array.forEach(callback())
自写一下forEach函数code
function forEach(array, x){ for(let i = 0;i < array.length; i++){ x(array[i],i) } }
这就是一个简单的forEach()自写的一个函数,array表明操做的数组,x表明用来操做数组的函数,传入数组和函数。对象
var obj = [] obj.forEach = function(x){ for(let i = 0; i < this.length; i++){ x(this[i], i) } }
this就是指代obj这个数组排序
sort() 方法用就地( in-place )的算法对数组的元素进行排序,并返回数组。 sort 排序不必定是稳定的。默认排序顺序是根据字符串Unicode码点。
arr.sort() arr.sort(compareFunction)
若是没有指明 compareFunction ,那么元素会按照转换为的字符串的诸个字符的Unicode位点进行排序。例如 "Banana" 会被排列到 "cherry" 以前。当数字按由小到大排序时,9 出如今 80 以前,但由于(没有指明 compareFunction),比较的数字会先被转换为字符串,因此在Unicode顺序上 "80" 要比 "9" 要靠前。
若是是数字想升序排列,sort()中输入:
function compareNumbers(a, b) { return a - b; }//也能够(a,b) => a-b
若是是数字想倒序排列,sort()中输入:
function compareNumbers(a, b) { return b - a; }//也能够(a,b) => b-a
对象能够按照某个属性排列:
var students = ['小明','小红','小花'] var scores = { 小明: 59, 小红: 99, 小花: 80 } students.sort(function(x, y){ return scores[y] - scores[x] })
另外sort()是一个比较特殊的API,由于它改变了自身数组,这是为了节省内存。
join() 方法将一个数组(或一个类数组对象)的全部元素链接成一个字符串并返回这个字符串。
str = arr.join(separator) // 分隔符
var a = ['a','s','d'] a.join()//"a,s,d" a.join('')//"asd" a.join('f')//"afsfd"
全部的数组元素被转换成字符串,再用一个分隔符将这些字符串链接起来。若是元素是undefined 或者null, 则会转化成空字符串。
concat() 方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。
var new_array = old_array.concat(value1[, value2[, ...[, valueN]]])
var alpha = ['a', 'b', 'c']; var numeric = [1, 2, 3]; alpha.concat(numeric);//[1, 2, 3, 4, 5, 6, 7, 8, 9]
将两个数组链接起来生成一个新的数组。
var alpha = ['a', 'b', 'c']; var alphaNumeric = alpha.concat(1, [2, 3]); //['a', 'b', 'c', 1, 2, 3]
能够直接将值链接到数组,生成一个新的数组。
var a = [1,2,3] var b = a.concat()//[1, 2, 3] b === a//false
concat()能够建立一个相同值的数组,可是是新建立的一个对象。
map() 方法建立一个新数组,其结果是该数组中的每一个元素都调用一个提供的函数后返回的结果。
map()和forEach()很像,可是forEach()返回undefined,而map()返回一个对数组内每一个数处理的数组。
let new_array = arr.map(function callback(value, key, array) { // Return element for new_array })
var a = [1,2,3] a.map(function(value,key){ return value *value })//[1,4,9]
map()能够对数组的每一个值进行操做,和forEach是基本同样的,可是,map()返回一个新的数组,而forEach返回的是undefined。
filter() 方法建立一个新数组, 其包含经过所提供函数实现的测试的全部元素。
array.filter(function(value, key, array){})
var a = [1,2,3,4,5,6,7,8,9,10] a.filter(function(value){ return value > 5 })//[6, 7, 8, 9, 10]
进行筛选,返回一个筛选以后的数组,不改变原数组
reduce() 方法对累加器和数组中的每一个元素(从左到右)应用一个函数,将其减小为单个值。
a.reduce(callback(prev, value),initial)
var a = [1,2,3,4,5,6,7,8,9,10] a.reduce(function(sum,n){ return sum + n },0)//55
对数组的内容累计处理,reduce能够变换实现map()和filter()
var a = [1,2,3] a.reduce(function(arr,n){ arr.push(n*2) return arr },[])//[2, 4, 6]
这就是reduce()实现map()的过程
var a = [1,2,3,4,5,6,7,8,9,10] a.reduce(function(arr,n){ if(n%2===0){ arr.push(n) } return arr },[])//[2, 4, 6, 8, 10]
这是reduce()实现filter()的过程