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属性也十分相似,也是要接受valuekey,也要返回值,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]

    注意:reversesort这两个属性比较特殊,使用后,效果会直接作用于数组本身,即数组本身的值会被改变。

本教程版权归宣泽彬所有,转载须说明来源

    原文作者:宣泽彬
    原文地址: https://www.jianshu.com/p/e930ae5039fe
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞