定场诗

大将生来胆气豪,腰横秋水雁翎刀。
风吹鼍鼓山河动,电闪旌旗日月高。
天上麒麟原有种,穴中蝼蚁岂能逃。
太平待诏归来日,朕与先生解战袍。

此处应该有掌声...

前言

读《学习JavaScript数据结构与算法》- 第3章 数组,本节将为各位小伙伴分享数组的相关知识:概念、创建方式、常见方法以及ES6数组的新功能。

数组

数组是最简单的内存数据结构,用于存储一系列同一种数据类型的值。

注:虽然数组支持存储不同类型的值,但建议遵守最佳实践。

一、数组基础

创建和初始化数组

  1. new Array()

    // 空数组
    let heros = new Array()
    // 指定长度的数组 - 默认每个索引位置的值为undefined
    heros = new Array(7)
    // 直接将数组元素以参数的形式传入数组构造器
    heros = new Array('钟馗', '张良', '虞姬', '亚瑟', '荆轲')
  2. 字面量语法:[]

    let heros = ['鲁班', '吕布', '王昭君', '蔡文姬', '孙悟空']

    推荐使用[]定义数组

数组索引

  • 数组的索引从0开始,依次累加;
  • 数组索引的最大值为数组的长度-1;
  • 每个数组的值都对应了一个数组的索引。

索引亦可称之为下标或键

数组长度

数组的.length属性可获取元素的长度

let heros = ['鲁班', '吕布', '王昭君', '蔡文姬', '孙悟空']
console.log('数组students的长度为:' + heros.length)

数组取值

使用 数组名[索引]的形式获取数组的值

let heros = ['凯', '兰陵王', '瑶', '云中君', '典韦']
console.log('第一位英雄:' + heros[0]) // 凯

迭代数组

此处我们使用高大上的名词迭代,拒绝低调的遍历,不要问我为什么!

数组的迭代我们可以选择最简单的循环结构

for (let i = 0; i < heros.length; i++) {
console.log(heros[i])
}

常见面试题:斐波那契数列

斐波那契数列概念:第一项为1,第二项为1,从第三项开始,值为前两项之和;

如 1, 1, 2, 3, 5, 8, 13 ...

// 求斐波那契数列前20个数
let fibonacci = []
fibonacci[0] = 1
fibonacci[1] = 1 for (let i = 2; i < 20; i++) {
fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2]
} // 输出
console.log(fibonacci)

二、数组元素操作

添加元素

数组尾部添加元素

  1. 将值赋值在数组的最后一个空位上的元素即可

    let heros = ['猪八戒', '嫦娥', '孙策']
    heros[heros.length] = ['苏烈']
  2. 使用push方法

    heros.push('黄忠')
    console.log(heros) // [ '猪八戒', '嫦娥', '孙策', '黄忠' ]

数组开头插入元素

  1. 自定义实现数组开头插入元素的方法

    实现逻辑思考:在数组的开头插入一个元素,需要空出数组第一个元素的位置,将所有的元素都向右移动一位

    Array.prototype.insertFirstPosition = function (value) {
    for (let i = this.length; i >= 0; i--) {
    this[i] = this[i - 1]
    }
    this[0] = value
    }
    heros.insertFirstPosition('周瑜')
    console.log(heros) // [ '周瑜', '猪八戒', '嫦娥', '孙策', '黄忠' ]
  2. 使用unshift方法

    heros.unshift('元歌')

    此方法背后的逻辑和insertFirstPosition方法的行为是一样的。

    常见面试问题:

    思考:如果有一个存储了大量数据的数组,在执行插入操作时,将值插入到指定的位置会发生什么情况?

    答:从当前插入值的位置开始,后面所有数组元素都要向右移动一位。

    追问:性能会好吗?

    答:肯定是不好的! 如包含1000个元素的数组,在数组索引0位置插入一个元素,需要移动1000个元素,性能肯定不好

    追问:如何优化呢?

    答:采用JS的链表结构 --- 啥是链表结构呢,请看持续关注公众号文中呦...

删除元素

数组尾部删除元素

heros.pop()

数组开头删除元素

heros.shift()

在任意位置添加或删除元素 -- splice

// array.splice(index[, number][, newValue1][, newValue2...])
// 从指定索引位置开始,执行删除相应数量的元素,并添加执行的元素
let heros = ['周瑜', '猪八戒', '嫦娥', '孙策', '黄忠']
heros.splice(2, 1, '孙悟空')
console.log(heros) // [ '周瑜', '猪八戒', '孙悟空', '孙策', '黄忠' ]

二维数组与多维数组

// 二维数组
let heros = [
['甄姬', '女娲', '安琪拉', '貂蝉'],
['典韦', '亚瑟', '曹操', '夏侯惇']
] // 二维数组取值
console.log(heros[0][1]) // 女娲 // 多维数组
heros = [
[
['甄姬', '安琪拉']
],
[
['操作', '夏侯惇']
]
]
// 多维数组取值
console.log(heros[0][0][1]) // 安琪拉

无论是几维的数组,只要按照索引去取值就好

三、数组常见方法

在JS中,数组是改进过的对象。这意味着创建的每一个数组都有一些可用的方法。

核心方法一览表

方法 描述
concat 连接2个或多个数组,返回结果
every 对数组中的每个元素运行给定函数,如果该函数对每个元素都返回true,则返回true
filter 对数组中的每个元素运行给定函数,返回该函数会返回true的元素组成的数组
forEach 对数组中的每个元素运行给定函数,这个方法没有返回值
join 将所有的数组元素连接成一个字符串
indexOf 返回第一个与给定参数相等的数组元素的索引,没有找到返回-1
lastIndexOf 返回数组中搜索到的与给定参数相等的元素的索引里最大的值
map 对数组中的每个元素运行给定函数,返回每次函数调用的结果组成的数组
reverse 颠倒数组中元素的顺序,反转
reduce 接收一个函数作为累加器,返回一个最终计算的值
slice 传入索引值,将数组里对应索引范围内的元素作为新数组返回
some 对数组中的每个元素运行给定函数,如果任意元素返回true,则返回true
sort 按照字母顺序进行排序,支持传入指定排序方法的函数作为参数
toString 将数组作为字符串返回
valueOf 和toString类似,将数组作为字符串返回

数组合并

concat方法可以向一个数组传递数组、对象或元素,数组会按照该方法传入的参数顺序连接指定的数组

let hz = '黄忠'
let partOfHeros = ['孙悟空', '孙斌', '李白']
let heros = ['钟馗']
let herosList = heros.concat(hz, partOfHeros)
console.log(heroList) // [ '钟馗', '黄忠', '孙悟空', '孙斌', '李白' ]

迭代器函数

一定要说迭代,不要说遍历,不要问我为什么!

every

every会迭代数组中的每个元素,直到返回false

// 判断数组中是否全部是偶数
let arr = [1, 2, 3, 4]
let res = arr.every(v => v % 2 === 0)
conso.e.log(res) // false

some

some会迭代数组中的每个元素,直到返回true

// 判断数组中是否有偶数
let arr = [1, 2, 3]
let res = arr.some(v => v % 2 === 0)
console.log(res) // true

forEach

迭代数组每一个元素

let arr = ['张良', '姜子牙', '露娜', '凯']

map

map会迭代数组的每个元素,对每个元素运行给定的方法,返回每次的结果

// 计算数组元素的乘方结果
let arr = [1, 2, 3]
let newArr = arr.map(v => v ** 2)
console.log(newArr) // [ 1, 4, 9 ]

filter

filter会迭代数组的每个元素,对每个元素运行给定的方法,返回的新数组由返回true的元素组成

// 返回数组中所有的女性英雄
let heros = [
{
name: '甄姬',
sex: '女'
},
{
name: '亚瑟',
sex: '男'
},
{
name: '貂蝉',
sex: '女'
}
]
let nvHeros = heros.filter(hero => hero.sex === '女')
console.log(nvHeros) // [ { name: '甄姬', sex: '女' }, { name: '貂蝉', sex: '女' } ]

reduce

接收一个函数作为累加器,最后返回一个计算的值

// 计算数组元素的和
let arr = [1, 2, 3, 4, 5, 6]
let sum = arr.reduce((previous, current) => previous + current)
console.log(sum) // 21

常见面试题-反转字符串

如字符串 abcdef 输出为 fedcba

  1. 使用for循环倒序拼接

    let str = 'abcdef'
    let newStr = ''
    for (let i = str.length - 1; i >= 0; i--) {
    newStr += str[i]
    }
    console.log(newStr) // fedcba
  2. 借助数组函数reversejoin与字符串函数split

    let str = 'abcdef'
    let newStr = str.split('').reverse().join('')
    console.log(newStr) // fedcba

后记

以上就是胡哥今天给大家分享的内容,喜欢的小伙伴记得收藏转发、点击右下角按钮在看,推荐给更多小伙伴呦,欢迎多多留言交流...

胡哥有话说,一个有技术,有情怀的胡哥!京东开放平台首席前端攻城狮。与你一起聊聊大前端,分享前端系统架构,框架实现原理,最新最高效的技术实践!

长按扫码关注,更帅更漂亮呦!关注胡哥有话说公众号,可与胡哥继续深入交流呦!

重读《学习JavaScript数据结构与算法-第三版》- 第3章 数组(一)的更多相关文章

  1. 重读《学习JavaScript数据结构与算法-第三版》- 第4章 栈

    定场诗 金山竹影几千秋,云索高飞水自流: 万里长江飘玉带,一轮银月滚金球. 远自湖北三千里,近到江南十六州: 美景一时观不透,天缘有分画中游. 前言 本章是重读<学习JavaScript数据结构 ...

  2. 重读《学习JavaScript数据结构与算法-第三版》- 第5章 队列

    定场诗 马瘦毛长蹄子肥,儿子偷爹不算贼,瞎大爷娶个瞎大奶奶,老两口过了多半辈,谁也没看见谁! 前言 本章为重读<学习JavaScript数据结构与算法-第三版>的系列文章,主要讲述队列数据 ...

  3. 重读《学习JavaScript数据结构与算法-第三版》-第2章 ECMAScript与TypeScript概述

    定场诗 八月中秋白露,路上行人凄凉: 小桥流水桂花香,日夜千思万想. 心中不得宁静,清早览罢文章, 十年寒苦在书房,方显才高志广. 前言 洛伊安妮·格罗纳女士所著的<学习JavaScript数据 ...

  4. 重读《学习JavaScript数据结构与算法-第三版》- 第6章 链表(一)

    定场诗 伤情最是晚凉天,憔悴厮人不堪言: 邀酒摧肠三杯醉.寻香惊梦五更寒. 钗头凤斜卿有泪,荼蘼花了我无缘: 小楼寂寞新雨月.也难如钩也难圆. 前言 本章为重读<学习JavaScript数据结构 ...

  5. 学习JavaScript数据结构与算法 (二)

    学习JavaScript数据结构与算法 的笔记 包含第四章队列, 第五章链表 本人所有文章首发在博客园: http://www.cnblogs.com/zhangrunhao/ 04队列 实现基本队列 ...

  6. 学习JavaScript数据结构与算法 (一)

    学习JavaScript数据结构与算法 的笔记, 包含一二三章 01基础 循环 斐波那契数列 var fibonaci = [1,1] for (var i = 2; i< 20;i++) { ...

  7. 学习JavaScript数据结构与算法---前端进阶系列

    学习建议 1.视频学习---认知 建议:在中国慕课上找"数据结构"相关的视频教程.中国大学MOOC 推荐清华大学.北京大学.浙江大学的教程,可先试看,然后根据自身的情况选择视频进行 ...

  8. 学习Javascript数据结构与算法(第2版)笔记(1)

    第 1 章 JavaScript简介 使用 Node.js 搭建 Web 服务器 npm install http-server -g http-server JavaScript 的类型有数字.字符 ...

  9. 学习JavaScript数据结构与算法 2/15

    第一章 JavaScript简介 js不同于C/C++,C#,JAVA,不是强类型语言. 通常,代码质量可以用全局变量和函数的数量来考量(数量越多越糟).因此,尽可能避免使用全局变量. JS数据类型 ...

随机推荐

  1. Python Day_1

    听说Python很6,然后我的偶像小甲鱼竟然在6年前(现在2019年)就开始制作Python的教程,而前不久(世界读书日前一个星期左右),京东有活动,小甲鱼的Python第一版本打折,顺便买了本(还凑 ...

  2. kuangbin专题 专题一 简单搜索 Fire Game FZU - 2150

    题目链接:https://vjudge.net/problem/FZU-2150 题意:’ . '代表火无法烧着的地方,‘ # ’表示草,火可以烧着.选择任意两个‘ # ’(可以两个都选同一个 ‘ # ...

  3. break使用不当引发的一个“血案”

    最近在网上冲浪,读到一则新闻,摘抄下这则新闻: ======================= 以下文字摘抄自互联网==================== 1990年1月15日,AT&T电话 ...

  4. 【题解】【合并序列(水题)P1628】

    原题链接 这道题目如果连字符串的基本操作都没学建议不要做. 学了的很简单就可以切,所以感觉没什么难度- 主要讲一下在AC基础上的优化(可能算不上剪枝) 很明显,这道题我们要找的是前缀,那么在字符串数组 ...

  5. 【攻略】百度货币识别API,搞定防诈骗的应用小程序

    1.需求及方案: 近两年用外币进行诈骗的案件很多.例如:2015年12月,一安徽诈骗团伙,用不值1角人民币的50印蒂(intis,秘鲁旧货币,1991年发行新货币后已停止流通,目前无货币价值,仅有&q ...

  6. linux weblogic12.1.3.0卸载过程

    主要是一开始以为跟之前版本一样有uninstall.sh,但却找不到. 最后google 才发现改了个名字,deinstall.sh 可能后面的版本都是这个脚本了吧. 先进入脚本目录,命令:cd /h ...

  7. 个人永久性免费-Excel催化剂功能第103波-批量打开多文件或多链接

    有时简单的东西,却带来许多的便利,为了让大家可以记住并容易找寻到此功能,也将这么简单的功能归为一波,反正已经100+波了,也无需为了凑功能文章而故意罗列一些小功能带忽悠性地让人觉得很强大. 使用场景 ...

  8. 推荐 2 款超牛逼、炫酷、实用的Docker管理工具!

    Docker技术的火热程度,想必每个互联网IT技术人员都能时时感受的到,的确,近些年,国内对于Docker容器技术的应用需求越来越强烈!! 人均年薪80万以上,docker到底是什么?为什么这么火? ...

  9. 小白开学Asp.Net Core《二》(补)

    小白开学Asp.Net Core<二>(补) ——数据仓储层(Repositroy).服务层(Service) -------------------------------------- ...

  10. C# MATLAB混编(一)

    参照这篇博客进行的C# MATLAB混编学习,学习过程中文章中的一些问题我并没有遇到,但是我遇到了一些新问题,这些问题的解决办法将在下一篇博客给出. 配置环境:vs2010(64位)+Matlab20 ...