js基础数组Array的一些特性及方法

@toc

前言: 工作业务数据乱,数据转换用得繁,对接交流竟无语,全靠数组方法换;

数据的了解

js数据类型

  • 在js基础中,我都们知道数据类型有两大类:原始类型(基本类型)、引用类型

基本类型

js有5 种原始类型,即 Undefined、Null、Boolean、Number 和 String。其中Undefined和Null也称作特殊类型

console.log(typeof undefined) // undefined
console.log(typeof null)   // object
console.log(typeof true)  // boolean
console.log(typeof 1)     // number
console.log(typeof '1')   // string
 

总结:基本类型,笔者就不作过多介绍具体详情可以查阅w3school,这里解释一下为何typeof null得出来的是object类型而不是null,因为null是一个只有一个值的特殊类型,它被认为是对象的占位符,表示一个空对象引用。

  • 在js中null == undefined 得到是真(true),尽管这两个值相等,但它们的含义不同。 undefined 是声明了变量但未对其初始化时赋予该变量的值,null 则用于表示尚未存在的对象(在讨论 typeof 运算符时,简单地介绍过这一点)。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。

引用类型

js中 基本类型的值基本是不可变的,但引用类型的值是动态可变的;基本类型的变量是存放在栈内存中,而引用类型的值是同时保存在栈内存和堆内存中的对象;

  • 引用类型一般指的是对象和方法;
  • 引用类型其实是在栈内存中存储了一个指针,这个指针指向堆内存中相应的存储地址

举例说明:

 let arr = [1,2,3,4,5,6]
  let arr1 = arr;
  arr1.push(1)
  console.log(arr,arr1)

如上代码:按照我们常规的想法是 arr = [1,2,3,4,5,6],arr1 = [1,2,3,4,5,6,1]的;

但实际输出如下:


实际输出

解释: 上面对引用类型的定义引用类型其实是在栈内存中存储了一个指针,这个指针指向堆内存中相应的存储地址有讲到指针的这个词,实际上上面代码的操作 let arr1 = arr;并不是把arr重新拷贝了一份给arr1,而是把arr存储在堆内存的存储地址给了arr1, 对arr1的修改,会对该地址指向的堆内存的数据进行修改,而arr和arr1指向堆内存的地址是相同的,所以打印结果一致;并且都改变了;

上述换成Object对象依然是一致的,不相信的同学可以私下试试~

数组的方法

w3school中我们可以知道数组有许多的方法,并且有些是我们经常用到且混淆不清的,接下来我们将对数组的方法进行详解;

1. Array.concat()

Array.concat() 的作用是连接两个或更多的数组,并返回结果。
使用


    let arrNum = [1,2,3,4,5,6]
    let arrStr = ['1','2','3','4','5','6']
    let arrObj = [{a:1},{b:'2'}]
    let arrAll =  arrNum.concat(arrStr).concat(arrObj)
    console.log(arrAll)

输出结果如下:


Array.concat()

此时因为concat()返回的是一个新的实例对象,对原数组操作(arrNum、arrStr)并不会影响到arrAll的值变化,但假如对arrObj进行改变,由于arrObj里面的对象属于引用类型,arrAll相应的值的地址指针依然是同一个堆内存,假如对arrObj进行改变,arrAll也会相应改变;而arrNum、arrStr里面的值是基本类型,则不影响

2. Array.join()

Array.join() 把数组的所有元素放入一个字符串并返回。元素通过指定的分隔符进行分隔。

  let   arrNum = [1,2,3,4,5,6]
  let   arrStr = ['1','2','3','4','5','6']
  let   arrObj = [{a:1},{b:'2'}]
  let   arrArr = [[1,2],['1','2']]
  console.log(arrNum.join('|'))
  console.log(arrStr.join(','))
  console.log(arrObj.join('-'))
  console.log(arrArr.join('='))
Array.join()
  • 返回的字符串均没问题,但假如数组里面是object,则返回[object Object] 字符串;

3. Array.pop()

Array.pop() 向数组的末尾添加一个或更多元素,并返回新的长度。注意!!!文档上没写明会改变原数组; 但实际上会改变

  let   arrNum = [1,2,3,4,5,6]
  let   arrStr = ['1','2','3','4','5','6']
  let   arrObj = [{a:1},{b:'2'}]
  let   arrArr = [[1,2],['1','2']]
  console.log(arrNum.pop())
  console.log(arrStr.pop())
  console.log(arrObj.pop())
  console.log(arrArr.pop())
  console.log(arrObj,arrArr)

输出结果:


Array.pop()

4. Array.push()

Array.push() 向数组的末尾添加一个或更多元素,并返回新的长度。

本来觉得用的最多,不想作介绍了但为了加以证明引用类型引用是的存储地址,修改原数组会导致引用相应地址的值也改变;
代码如下:

  let   arrNum = [1,2,3,4,5,6]
  let   arrStr = ['1','2','3','4','5','6']
  let   arrObj = [{a:1},{b:'2'}]
  let   arrArr = [[1,2],['1','2']]
  let  arrAll = []
  console.log(arrAll.push(arrNum))
  console.log(arrAll.push(arrStr))
  console.log(arrAll.push(arrObj))
  console.log(arrAll.push(arrArr))
  console.log('改变前===',arrAll)
  arrNum[0] = 10000
  arrStr[0] = 10000
  arrObj[0] = 10000
  arrArr[0] = 10000
  console.log('改变后===',arrAll)
Array.push()

总结:再次证明引用类型的特点;

5. Array.reverse()

Array.reverse() 颠倒数组中元素的顺序。

  let   arrNum = [1,2,3,4,5,6]
  let   arrStr = ['1','2','3','4','5','6']
  let   arrObj = [{a:1},{b:'2'}]
  let   arrArr = [[1,2],['1','2']]
  console.log(arrNum.reverse())
  console.log(arrStr.reverse())
  console.log(arrObj.reverse())
  console.log(arrArr.reverse())

常规使用,毫无问题


Array.reverse()

6. Array.shift()

Array.shift() 删除并返回数组的第一个元素,具体表现和上面的 3. Array.pop() 完全类似,同样会改变原数组,不作过多介绍;

7. Array.unshift()

Array.unshift()向数组的开头添加一个或更多元素,并返回新的长度。

用法:

arrayObject.unshift(val1,val2,....,valn)

参数解释:

  • val1 必需。向数组添加的第一个元素。
  • val2 可选。向数组添加的第二个元素。
  • valn 可选。向数组添加的第n个元素。

注意:unshift() 方法将把它的参数插入 arrayObject 的头部,并将已经存在的元素顺次地移到较高的下标处,以便留出空间。该方法的第一个参数将成为数组的新元素 0,如果还有第二个参数,它将成为新的元素 1,以此类推。并且 unshift() 方法不创建新的创建,而是直接修改原有的数组。
使用如下:

    let arrNum = [1,2,3,4,5,6]
    let arrStr = ['1','2','3','4','5','6']
    let arrObj = [{a:1},{b:'2'}]
    let arrArr = [[1,2],['1','2']]
    console.log(arrNum.unshift(1,2,3,4,5,6))
    console.log(arrStr.unshift('1','2','3','4','5','6'))
    console.log(arrObj.unshift({a:1},{b:'2'}))
    console.log(arrArr.unshift([1,2],['1','2']))
    console.log(arrNum,arrStr,arrObj,arrArr)

输出:


Array.unshift()

8. Array.slice()

Array.slice() 方法可从已有的数组中返回选定的元素。

用法:

arrayObject.slice(start,end)

参数解释:

  • start : 必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。
  • end : 可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。
  • 返回值 :返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。
    使用
  let   arrNum = [1,2,3,4,5,6]
  let   arrStr = ['1','2','3','4','5','6']
  let   arrObj = [{a:1},{b:'2'}]
  let   arrArr = [[1,2],['1','2']]
  console.log(arrNum.slice(0,1))
  console.log(arrStr.slice(0,1))
  console.log(arrObj.slice(0,1))
  console.log(arrArr.slice(0,1))
  console.log(arrNum,arrStr,arrObj,arrArr)

输出如下:


Array.slice()

注意: 该方法并不会修改原数组,而是返回一个子数组

9. Array.splice()

Array.splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。

用法:


arrayObject.splice(index,delLong,item1,.....,itemN)

参数解释:

  • index : 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
  • delLong :必需。要删除的项目数量。如果设置为 0,则不会删除项目。
  • item1, ..., itemN :可选。向数组添加的新项目。

注意: splice() 方法可删除从 index 处开始的零个或多个元素,并且用参数列表中声明的一个或多个值来替换那些被删除的元素。

如果从 arrayObject 中删除了元素,则返回的是含有被删除的元素的数组。

使用:

  let   arrNum = [1,2,3,4,5,6]
  let   arrStr = ['1','2','3','4','5','6']
  let   arrObj = [{a:1},{b:'2'}]
  let   arrArr = [[1,2],['1','2']]
  console.log(arrNum.splice(-1,1,10000))
  console.log(arrStr.splice(0,0,'10000'))
  console.log(arrObj.splice(0,1))
  console.log(arrArr.splice(0,1))
  console.log(arrNum,arrStr,arrObj,arrArr)

结果如下:


image.png

注意: 该方法会修改原数组,而是返回一个子数组。如果从 arrayObject 中删除了元素,则返回的是含有被删除的元素的数组。如果未删除,则返回空数组;

总结: slice()和splice()容易混淆,不过这样记就好:单词长的参数也长,参数长的功能大,可加可减可改变

9. Array.sort()

Array.sort() 方法用于对数组的元素进行排序。

用法:

arrayObject.sort(sortby)

参数解释:

  • sortby : 可选。规定排序顺序。必须是函数。

使用:

let arrNum = [6,2,1,3,4,5]
  let   arrStr = ['6','2','1','3','4','5']
  let   arrObj = [{b:'2'},{a:1}]
  let   arrArr = [['2','1'],[2,1]]
  console.log(arrNum.sort())
  console.log(arrStr.sort())
  console.log(arrObj.sort())
  console.log(arrArr.sort())
  console.log(arrNum,arrStr,arrObj,arrArr)
    var arr = [1,2,4,3,2,1]

    console.log(arr.sort(function (m,n) {
    if (m < n) return -1
    if (m > n) return 1
    if (m == n)return 0
  }))

结果如下:


Array.sort()

总结:实际上上面代码写的方法就是sort()默认的方法;方法可以自定义;

最后数组方法的扩展

从字面认知:every是每一个都,some是都有一些就~~
即:

  1. every():方法用于检测数组中所有元素是否都符合指定条件,若符合返回true,否则返回false;
  2. some():方法用于检测数组中的元素是否有满足指定条件的,若满足返回true,否则返回false;

every()

// every():方法用于检测数组中所有元素是否都符合指定条件,若符合返回true,否则返回false,且程序不会继续往下执行;
array.every(function(item,index,array){
                 // item:当前元素的值;

                 // index:当前元素的索引;

                 // array:当前元素的数组对象;

         })

例子:
//es6
let age = [10,20,30,40,50,22,26]
 // 所有都满足才会返回true,否则返回false;
 let result = age.every((item,index,array)=>{
 console.log(item) // 10
 console.log(index) // 0
 console.log(array) //[10,20,30,40,50,22,26]

     return item > 22;
    })

// es5
// let result = age.every(function(item,index,array){
//     return item > 22;
//  })
    console.log(result) // false

some()

// some():方法用于检测数组中是否有元素符合指定条件,若有符合的返回true,且程序不会继续往下执行;否则返回false;
array.some(function(item,index,array){
                 // item:当前元素的值;

                 // index:当前元素的索引;

                 // array:当前元素的数组对象;

         })

例子:
//es6
let age = [10,20,30,40,50,22,26]
 // 所有都满足才会返回true,否则返回false;
 let result = age.some((item,index,array)=>{

  console.log(item) // 10 20 30
  console.log(index) // 0 1 2
  console.log(array) //[10,20,30,40,50,22,26]


     return item > 22;
    })

// es5
// let result = age.some(function(item,index,array){
//     return item > 22;
//  })
    console.log(result) // true

以上就是js基础中 数组常用的方法,特别要注意的是splice和slice容易混淆,其他的话,用过几次就基本没有问题了,此次代码已经上传到github,有兴趣可以去下载实现一波喔@王一诺wLove-c/JavaScript-demo,如果对你有帮助,请点个赞吧;

更多内容请转作者博客@王一诺的博客,多多交流~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342