浅谈JS数组以及Array构造函数

2019-03-02  本文已影响0人  印第安老斑鸠_333

一.关于数组

    1.什么是数组

        ①,数组的数据类型是Object,也就是说数组是对象。

        ②,数组是按照顺序排列的一组值,这也是区别于普通对象的一种特征。

        ③,数组是Array构造函数的实例,原型指向Array.prototype,并继承其属性和方法。普通对象则继承Object.prorotype的属性和方法,这也是区别于普通对象的一种特征。

        ④,var arr = [1,'2',{},function(){},null,true,[ ] ];arr就是数组,[ ]这两个方括号就是数组的特征。里面的成员可以是任意数据类型。

        ⑤,数组的成员不需要写下标,因为下标是固定的,0代表第一个1代表第二个......

    2.数组成员以及length属性

        ①,数组里面的每个成员,都有按次序排列的下标,也就是键值,从0开始到4294967294(2的32次方减2)结束。

        ②,length属性的值,初始由数组成员数量决定,最多4294967295(2的32次方减1)个。因为数组成员的下标从0开始,所以length的值为数组中存在的最大下标加1。      

            ⑴.length属性可写,如果写入的值大于实际数组成员数量,那么成员数量就等于你写入的值但多出的全部是空位,空位就是位置上啥都没有[,,,,,,]。

            ⑵.写入的length属性小于实际数组成员,成员数量还是等于你写入的值,多出的全部删除,如果length=0,则清空所有成员,这是一个清空数组的办法。

        ③,读取数组成员的方法就是arr[key],key为下标,下标就是成员所在的位置。

            ⑴.可动态添加或覆盖数组成员,直接赋值即可,arr[key] = value

            ⑵.delete命令可删除一个成员,删除以后该位置为空位,空位就是该位置啥都没有,但是这个位置还存在,所以不影响length的值,也不影响其他成员的位置。

        ④,可以不按照数组方式添加成员,比如arr.name = '张三',但这并不会影响其他成员,也不会影响length的值,也就是说不会影响length所表示的成员数量以及其他成员的下标。

3.遍历数组

   ①,in运算符

        ⑴,和对象一样,可以查看一个成员是否存在于数组当中,使用方法:key in arr,如果存在返回true,不存在返回false。空位返回false。

    ②,for.....in......

        ⑴,用来遍历数组,但需注意,除了不可遍历属性以及空位不被遍历以外,非数字键也会被遍历,继承属性也会被遍历。

    ③,for循环和while循环遍历可以遍历空位。

        ⑴,  声明一个数组arr = [1,2,3,4,5,,];。

                 for (var index=0;index<arr.length;index++){

                        console.log(arr[index])

                    }//1,2,3,4,5,undefined

    4.关于空位

        ①,[,,,,,,,]这是空位。   

        ②,写入的length的值大于当前数组成员数量,多出来的也是空位。

        ③,delete删除的成员也是空位。

        ④,读取空位的值为undefined,比如读取[,,]里面的空位以及上面②③的操作,但是注意,这和[undefined,undefined]是完全不一样的,因为undefined是实实在在的存在的值。

        ⑤,空位([,,])就是空占位置,没有任何东西,虽然他返回undefined。就比如一个已经被声明,但没被赋值的变量一样,比如var a。

        ⑥,[undefined]是有东西的,一目了然,值也是undefined。这个变量是这么声明的:var a = undefined。

二.关于Array构造函数

1.Array是什么

        ①,它是一个函数,函数属于Object类型,所以它也是一个对象。

        ②,它是JS内置的原生对象。是Function的实例。原型对象指向Function.prototype.

        ③,数组是Array的实例。数组的原型对象指向Array.prototype。所以继承了后者的属性和方法。

2.Array怎么用

        ①,var arr = new Array();声明一个数组。

            ⑴,一个正整数参数,实例的数组length属性与之对应。

            ⑵,多个参数or一个非数字参数,实例的数组成员与之一一对应。

            ⑶,没有参数,实例的数组为空数组。

            ⑷,一个小数或负数为参数,报错。

实例数组对象

        ②,new Array()与Array()作用是一样的。也就是说,①里介绍的用Array()完全可以实现。

3.实例继承的方法

①,arr.pop() arr.push()

        ⑴,push()接受一个或多个参数,将其插入数组尾部,返回一个插入后的数组length属性。

        ⑵,pop()删除最末端成员,返回该成员属性值。

        ⑶,它俩构成先进后出,也就是stack,栈。

②,arr.shift() arr.unshift()

         ⑴,unshift()接受一个或多个参数,将其插入数组首部,返回一个插入后的数组length属性。

         ⑵,shifth()删除最前端成员,返回该成员属性值。

         ⑶,push()和shift()结合使用,就构成了“先进先出”的队列结构。

③,arr.join();

           ⑴, join()方法以指定参数作为分隔符,将所有数组成员连接为一个字符串返回。如果不提供参数,默认用逗号分隔。

           ⑵,如果数组成员是undefined或null或空位,会被转成空字符串。

④,arr.concat()

          ⑴,接受多个参数,用于合并数组,如果参数是数组,则合并数组,如果是其他类型的值,则依次添加到原数组中,返回一个新数组。不会修改原数组

           ⑵,会在数组尾部添加合并项。

           ⑶,参数可为空,那就会返回一个和原数组一模一样的数组出来。

⑤,arr.reverse()

           ⑴,reverse方法用于颠倒排列数组元素,返回改变后的数组。注意,该方法将改变原数组

⑥,arr.slice()

            ⑴,该方法可以取出数组的一部分并返回一个新数组。

            ⑵,接受两个参数,第一个为起始位置(从零开始),第二个为终点位置(并不包含该位置),接受负数,负数代表倒着定位置。只有一个参数的话就从这个位置一直到终点。不些参数就提取全数组并返回,相当于拷贝了原数组。第二个参数代表的位置如果在第一个的前面,返回空数组。

⑦,arr.splice()

             ⑴,splice方法用于删除原数组的一部分成员,并可以在删除的位置添加新的数组成员,返回值是被删除的元素。注意,该方法会改变原数组。

            ⑵, splice的第一个参数是删除的起始位置(从0开始),第二个参数是被删除的元素个数。如果后面还有更多的参数,则表示这些就是要被插入数组的新元素(在起始位置插入)。

            ⑶,起始位置如果是负数,就表示从倒数位置开始删除。

            ⑷,如果只是单纯地插入元素,splice方法的第二个参数可以设为0。

            ⑸,如果只提供第一个参数,等同于将原数组在指定位置拆分成两个数组。

    ⑧,arr.sort()

            给数组成员排序,默认按照unicode码点排序,如果成员不是字符转会先转为字符串。

            该方法接受一个函数作为参数,参数函数本身接受两个参数,比如a和b,a代表数组的第一个成员,b就代表第二个成员。从大到小排,就在参数函数的函数体内return b-a,反之return a-b。

    ⑧,arr.map()

            ⑴,map方法将数组的所有成员依次传入参数函数,有几个成员就执行几次,然后把每一次return出来的值按次序组和成数组返回。

            ⑵,map方法接受一个函数作为参数。该函数调用时,map方法向它传入三个参数:当前成员、当前位置和数组本身。

            ⑶,map方法还可以接受第二个参数,用来绑定回调函数内部的this变量(详见《this 变量》一章)。

             ⑷,如果数组有空位,map方法的回调函数在这个位置不会执行,会跳过数组的空位。

             ⑸,map方法不会跳过undefined和null,但是会跳过空位。

    ⑨,arr.forEach()

            和map方法几乎一样,就是没有返回值。就是循环遍历数组,不会被break和container打断。

      ⑩,arr.filter()

             ⑴,同样也是遍历数组,也是每存在一个成员就执行一次,也会返回一个数组,只不过不同在于它在每次执行的时候都要查看return出来的值所转换的布尔值,然后把每次return出转换布尔值为true的回合所对应的数组成员组合成新数组返回。

    ⑪,arr.reduce()

            ⑴,该方法牛逼去了,太强大了,他接受两个参数,第一个是函数,第二个是初始值(累计变量的初始值),这个初始值可以是任意数据类型。参数函数接受四个参数,分别是累计变量(默认数组第一个成员),当前变量(默认数组第二个成员),当前位置,原数组。

             ⑵,每次执行结束,会把return的值赋值给累计变量,当遍历结束,返回累计变量的最后值。

    ⑫,arr.indexOf(),arr.lastIndexOf()

            ⑴,indexOf方法返回给定元素在数组中第一次出现的位置,如果没有出现则返回-1。

            ⑵,indexOf方法还可以接受第二个参数,表示搜索的开始位置。

            ⑶,lastIndexOf方法返回给定元素在数组中最后一次出现的位置,如果没有出现则返回-1。

            注意,这两个方法不能用来搜索NaN的位置,即它们无法确定数组成员是否包含NaN。这是因为这两个方法内部,使用严格相等运算符(===)进行比较,而NaN是唯一一个不等于自身的值。

                                                                                                        参考:阮一峰JS教程

上一篇下一篇

猜你喜欢

热点阅读