JS里的数组
本篇文章将简要介绍一下数组的定义及其相关属性的用法。
一.数组的定义:
数组(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
这两个属性比较特殊,使用后,效果会直接作用于数组本身,即数组本身的值会被改变。
本教程版权归饥人谷_宣泽彬和饥人谷所有,转载须说明来源
作者:宣泽彬
链接:https://www.jianshu.com/p/e930ae5039fe
共同学习,写下你的评论
评论加载中...
作者其他优质文章