本篇文章将简要介绍一下数组的定义及其相关属性的用法。
一.数组的定义:
数组(array)是按次序排列的一组值。本质上,数组属于一种特殊的对象。typeof
运算符会返回数组的类型是object
。因此,数组是一种特殊的对象,它具备对象所拥有的属性。
二.定义数组的几种办法:
//第一种:
var a=[1,2,3]
//第二种:
var a=Array(3,3) //[3,3]
//第三种:
var a=new Array(3,3) //[3,3]
在这里,后面两种方法存在着不一致性的情况,当Array()
里只有一个参数时,参数所表示的含义为length
的长度
var a=Array(3) //[undefined,undefined,undefined]
var b=new Array(3) //[undefined,undefined,undefined]
//与下面不一致
var a=Array(3,3) //[3,3]
var b=new Array(3,3) //[3,3]
在这里值得一提的是,简单数据类型的定义方法中加不加new
所得到的结果是不一样的,比如:
var a=Number(1) //声明的a为基本类型
var b=new Number(1) //声明的b为对象
而复杂数据类型中,加不加new
所得到的结果是一样的。得到的均为一个对象。
三.伪数组
伪数组的定义是原型链与Array.prototype
没有一点关系的,并且可以类似数组一样能用length
遍历的对象叫作伪数组。
arguments
是目前唯一会接触到的伪数组:
function f(){
console.dir(arguments)
}
f.call(undefined,1,2,3)
arguments={
0:1
1:2
2:3
callee:ƒ f()
length:3
Symbol(Symbol.iterator):ƒ values()
__proto__:Object
}
四.介绍数组的几种常见属性及其使用方法
1.forEach
var a=['a','b','c','d']
a.forEach(function(x,y) {
console.log('value',x)
console.log('key',y)
})
// value a
// key 0
// value b
// key 1
// value c
// key 2
// value d
// key 3
可以自己构造一个forEach
函数:
var a=[1,2,3]
a.forEachSelf=function(x) {
for (let i=0;i<this.length;i++) {
x.call(undefined,this[i],i)
}
}
a.forEachSelf.call(a,function(x,y) {
console.log('value',x)
console.log('key',y)
})
2.sort
sort
属性的作用是对数组自身进行排序,进行的排序为快速排序,排序后会改变数组原来的值。
a.sort( function(x,y) { return x-y } ) //从小到大排序
a.sort( function(x,y) { return y-x } ) //从大到小排序
原理:return
的值为非负数,则会交换x与y的位置
a=['马云','马化腾','李彦宏']
hash={
'马云':167.92,
'马化腾':376,
'李彦宏':228.62
}
a.sort( function(x,y) { return hash[x]-hash[y] } ) //["马云","李彦宏","马化腾"]
a.sort( function(x,y) { return hash[y]-hash[x] } ) //["马化腾","李彦宏","马云"]
3.join
join
属性的作用是把数组里的每个值合并成一个字符串,并在每个值中间插入一个新的字符串。
var a=[1,2,3]
a.join('你好') //'1你好2你好3'
a.join(',') //'1,2,3'
a.join() //'1,2,3'
这里值得一提的是一下几种情况:
var a=[1,2,3]
1+'' //'1'
a+'' //'1,2,3'
a.toString() //'1,2,3'
4.concat
concat
属性的作用是创建一个新的数组,数组内的值为原来来个数组的值的合并。
var a=[1,2,3]
var b=[4,5,6]
a+b //'1,2,3,4,5,6'
a.concat(b) //[1,2,3,4,5,6]
concat
有一种特殊用法,可以通过使用concat
属性来复制一个新的数组,新数组与被复制数组的值相同,但地址不同,因此是两个不相等的数组。
var a=[1,2,3]
var b=a.concat([])
b //[1,2,3]
a===b //false
//要与下面的代码区分清楚
var a=b
a===b //true
5.map
map
属性的功能和forEach
属性的功能一模一样,但区别在于a.forEach
没有返回值,但是a.map
有返回值。
a.map(function (value,key) {
return value*2 }) // [2,4,6]
//上述代码等价于下面的代码
a.map( value => value*2 )
若使用map
属性时不写出返回值,默认返回undefined
。
6.filter
filter
属性和map
属性也十分相似,也是要接受value
和key
,也要返回值,filter
属性的作用是“过滤”,在filter
属性遍历数组中的每个值的时候,若返回值为true
,则代表该值需要,并记录在filter
即将返回的数组中,若返回值为false
,则表示该值不需要,可以舍弃。
var a=[1,2,3,4,5,6,7,8,9,10]
a.filter ( function(value,key) {
return value>=5
}) //[5,6,7,8,9,10]
7.reduce
reduce
属性的作用是遍历数组里的每个值,并把该值选出来进入函数中进行操作,把操作后的值保存并用于下一个数组的值的操作中。
var a=[1,2,3]
a.reduce ( function(sum,n) { //sum是上一项返回的结果,n是这一项数组传入的值
return sum+n
},0) //0为sum的初始值
// 6 值得注意sum和n均为value
//上述代码等价于下面代码
var a=[1,2,3]
a.reduce( (sum+n) => sum+n ,0 )
8.reverse
reverse
属性的作用是把数组的值翻转。并改变数组原来的值。
var a=[1,3,5,2,4,6]
a.reverse() //[6,4,2,5,3,1]
注意:reverse
、sort
这两个属性比较特殊,使用后,效果会直接作用于数组本身,即数组本身的值会被改变。