前端js进阶,ES6语法,包详细
进阶ES6
作用域的概念加深对js理解
let、const申明的变量,在花括号中会生成块作用域,而var就不会生成块作用域
作用域链本质上就是底层的变量查找机制
作用域链查找的规则是:优先查找当前作用域先把的变量,再依次逐级找父级作用域直到全局作用域。
垃圾回收机制GC
全局变量一般不会回收除非关闭页面,一般情况下局部变量的值,不用了,会被自动回收掉
内存泄漏:程序中分配的内存由于某种原因程序未释放或者无法释放叫做内存泄漏
js垃圾回收—算法说明

缺点:嵌套引用,如果两个对象相互引用,尽管他们已不再使用,垃圾回收器不会进行回收,导致内存泄漏


闭包
- 简单理解:闭包 = 内层函数 + 外层函数的变量
代码演示:
function outer(){const a = 1function f(){console.log(a)}f()
}
outer()
-
闭包的作用: 外部也可以访问函数内部的变量
-
闭包的应用,记录函数被调用的次数
let i = 0
function fn() {i++console.log(`函数被调用了${i}次`)
}
- 全局变量容易被修改,有风险,修改成闭包的形式
// 统计函数被调用的次数----闭包形式
function count(){let i = 0function fn() {i++console.log(`函数被调用了${i}次`)}return fn
}
const fun = count()
变量提升(只提升声明,不提升赋值)
// 1. 把所有var声明的变量提升到当前作用域的最前面
// 2. 只提升变量名, 不提升赋值
// var num
console.log(num + '件')
var num = 10
// 打印结果为 undefined件
函数进阶
函数提升(只提升声明,不提升赋值)
// 1. 会把所有函数声明提升到当前作用域的最前面
// 2. 只提升函数声明, 不提升函数调用
fn()
function fn(){console.log('函数提升')
}
函数参数
- 动态参数(箭头函数中没有)
// 计算所有参数的和
function sum(){let s = 0for (let i = 0; i < arguments.length; i++){s += arguments[1]}console.log(s)
}// 调用求和函数
sum(5, 10) // 两个参数
sum(1, 2, 4) // 三个参数
总结:
- arguments 是一个伪数组, 只存在于函数中
- arguments 的作用是动态的获取函数的实参
- 可以通过for 循环依次得到传过来的实参
- 剩余参数(在函数中使用的时候,不需要加…)

- …是语法符号,置于最末函数形参之前, 用于获取多余的实参
- 借助…获取的剩余实参,是个真数组
- 展开运算符(不会修改原数组)
- 典型的使用场景:求数组的最大值
const arr = [1, 2, 3]
console.log(Math.max(...arr)) // 3
- 用于合并数组
const arr1 = [1, 2, 3]
const arr2 = [4, 5, 6]
const arr3 = [...arr1, ...arr2]
console.log(arr3) // 1, 2, 3, 4, 5, 6
箭头函数
const fn = () =>{console.log(123)
}
fn()
// 只有一个形参的时候可以省略小括号
const fn = x => {console.log(x)
}
fn(1)
// 只有一行代码的时候, 我们可以省略大括号
const fn = x => console.log(x)
fn(1)
// 只有一行代码,可以省略return
const fn = (x, y) => x + y
console.log(fn(1, 2)) // 3
// 箭头函数可以直接返回一个对象
const fn = (uname) => ({uname: uname})
fn('刘德华')
- 箭头函数+剩余参数
const getSum = (...arr) =>{let sum = 0for (let i = 0; i < arr.length; i++){sum += arr[i]}return sum
}
const result = getSum(2, 3, 4)
console.log(result) // 9
解构赋值
- 数组解构
- 数组解构是将数组中的单元值,快速的赋值给一系列变量的简洁语法
const arr = [100, 60, 80]
// 数组结构 赋值
const [max, min, avg] = arr
// const max = arr[0]
// const min = arr[1]
// const avg = arr[2]
console.log(max) // 100
console.log(avg) // 80
- 可以用于交换变量
let a = 1
let b = 2; // 这个地方一定要加;不加就报错
[b, a] = [a, b]
console.log(a, b) // 2, 1// 1. 立即执行函数要加
(function () { })();
(function () { })();
// 2. 使用数组的时候
const str = 'pink';
[1, 2, 3].map(function (item) {console.log(item)
})
const [a, b, ...c] = [1, 2, 3, 4]
console.log(a) // 1
console.log(b) // 2
console.log(c) // [3, 4]// 防止undefined 传递
const [a = 0, b = 0] = []
cosnole.log(a) // 0
console.log(b) // 0// 按需求导入,忽略某些值
const [a, b, ,c] = [1, 2, 3, 4]
console.log(a) // 1
cosnole.log(b) // 2
console.log(c) // 4
- 多维数组的解构

对象解构
// 对象解构语法(要求声明的变量,必须和属性名相同,并且不能与外部变量名冲突)
const { uname, age } = { uname: 'hello', age: 18}
console.log(uname) // hello
console.log(age) // 18// 修改变量名
const { uname: name1, age } = { uname: 'hello', age: 18}
console.log(name1) // hello
console.log(age) // 18
- 多级对象解构



forEach方法

深入对象
创建对象的三种方式

- 构造函数来创建对象(用来创建多个类似的对象)
function Pig(name, age, gender) {this.name = namethis.age = agethis.gener = gender
}
// 创建佩奇对象
const Peppa = new Pig('佩奇', 6, '女')
// 创建乔治对象
const George = new Pig('乔治', 3, '男')
- 构造函数的约定
- 他们的命名以大写字母开头
- 他们只能用new来操作执行
- new 实例化执行过程
- 创建新对象
- 构造函数this指向新对象
- 执行构造函数代码,修改this, 添加新的属性
- 返回新对象
实例成员&静态成员
实例成员:通过够着函数创建对象称为实例对象,实例对象中的属性和方法称为实例成员(实例属性和实例方法)
静态成员:构造函数的属性和方法被称为静态成员(静态属性和静态方法)
基本包装类型

内置构造函数
const o = { uname : 'kwh', age : 18}
// 获取所有的属性名
console.log(Object.keys(o))
// 获取所有的属性值
console.log(Object.values(o))const oo = {}
Object.assign(oo, o) // 对象的拷贝
// 数组reduce方法
// arr.reduce(function(上一次值, 当前值){}, 初始值)
const arr = [1, 5, 8]// 1. 没有初始值
const total = arr.reduce(function (prev, current){return pre + current
})
console.log(total) // 14// 2. 有初始值(在有初始值的情况下,累加后需要将初始值也一并加上)
const total = arr.reduce(function (prev, current){return prev + current
}, 10)
console.log(total) // 24// 3. 箭头函数的写法
const total = arr.reduce((prev, current) => prev + current, 10)
console.log(total)

如果遇到对象累加,一定要给初始值,不然prev就是对象中的第一个元素


find方法最常用的场景
const arr = [{name: '小米',price: 1999},{name: '华为',price: 3999}
]
// 找出小米这个对象,并且返回这个对象
arr.find(function(item){return item.name === '小米'
})
小案例
const spec = { size: '40cm*40cm', color: '黑色'}
//1. 所有的属性值取过来
console.log(Object.values(spec))
//2. 转换为字符串 join('/')
console.log(Object.values(spec).join('/'))
//3. 展示在页面上
document.querySelector('div').innerHTML = Object.values(spec).join('/')


// 判断是不是以某个字符开头
const str = 'pink老师上课中'
console.log(str.startsWith('pink'))

<body><div></div><script>const gift = '50g的茶叶, 清洗球'// 1. 把字符串拆分为数组// console.log(gift.split(','))// 2. 根据数组元素的个数, 生成 对应 span标签const str = gift.split(',').map(function (item){return `<span>【赠品】${item}</span><br>`}).join('')// console.log(str)document.querySelector('div').innerHTML = str</script>
</body>
// 代码优化
document.querySelecter('div').innerHTML = gift.split(',').map(item => `<span>【赠品】 ${item}</span> <br>`).join('')
Number
toFixed()方法
// 当toFixed方法中不再传递参数的时候,就相当于四舍五入
const num = 10.923
console.log(num.toFixed()) // 11// 当toFixed方法传入参数的时候,小括号内即为限制小数点保留几位
console.log(num.toFixed(2)) // 10.92
深入面相对象
面向过程:分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现
面向对象:把事务分解为一个个对象,然后由对象之间分工与合作
- 面向对象的特征:
- 封装性
- 继承性
- 多态性

- 构造函数
公共的属性和方法封装到Star 构造函数里面了
function Star(uname, age){this.uname = unamethis.age = agethis.sing = function() {console.log('唱歌')}
}
const ldh = new Star('刘德华', 55)
const zxy = new Star('张学友', 58)
- js实现面向对象需要借助于谁来实现?
- 构造函数
- 构造函数存在什么问题?
- 在存储复杂数据类型的时候,会出现浪费内存
原型
- 构造函数通过原型分配的函数是所有对象所共享的。
- javaScript规定, 每一个构造函数都有一个prototype属性,指向另一个对象,所以我们也称为原型对象
- 这个对象可以挂载函数,对象实例化不会多次创建原型上函数,节约内存
- 我们可以把那些不变的方法,直接定义在prootype对象上,这样所有对象的实例就可以共享这些方法
- 构造函数和原型对象中的this都指向实例化的对象
// 1. 公共的属性卸载构造函数中
function Star(uname, age){this.uname = unamethis.age = age
}
// 2. 公共的方法卸载原型对象身上
Star.prototype.sing = function(){console.log('唱歌')
}
const ldh = new Star('刘德华', 55)
const zxy = new Star('张学友', 58)
console.log(ldh.sing === zxy.sing) // true
- 构造函数和原型对象中的this都指向实例化的对象
自定义 数组扩展方法 求和 和 最大值
- 定义的这个歌方法, 要在任何一个数组实例对象都可以使用
- 自定义的方法写到 数组.prototype身上
- 求数组中的最大值
const arr = [1, 2, 3]
Array.prototype.max = function () {// 展开运算符return Math.max(...this)// 原型函数里面的this 指向实例对象 arr
}
console.log(arr.max()) // 3
console.log([1, 5, 9].max()) // 9// 求和
Array.prototype.sum = function() {return this.reduce( (prev, item) => prev + item, 0)
}
console.log([1, 2, 3].sum()) // 6
constructor属性
- constructor 这个单词的意思就是:构造函数
- 每个原型对象里都有个constructor属性
- 作用:指向该原型对象的构造函数
console.log(Star.prototype.constructor === Star) // trueStar.prototype = {// 重新指回创造这个原型对象的 构造函数constructor: Star,sing: function(){console.log('唱歌')},dance: function () {console.log('跳舞')}
}
console.log(Star.prototype)

相关文章:
前端js进阶,ES6语法,包详细
进阶ES6 作用域的概念加深对js理解 let、const申明的变量,在花括号中会生成块作用域,而var就不会生成块作用域 作用域链本质上就是底层的变量查找机制 作用域链查找的规则是:优先查找当前作用域先把的变量,再依次逐级找父级作用域直到全局…...
Scrum方法论指导下的Deepseek R1医疗AI部署开发
一、引言 1.1 研究背景与意义 在当今数智化时代,软件开发方法论对于项目的成功实施起着举足轻重的作用。Scrum 作为一种广泛应用的敏捷开发方法论,以其迭代式开发、快速反馈和高效协作的特点,在软件开发领域占据了重要地位。自 20 世纪 90 …...
LINUX安装使用Redis
参考 Install Redis on Linux | Docs 安装命令 sudo apt-get install -y lsb-release curl gpgcurl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpgsudo chmod 644 /usr/share/keyrings/redis-archive-keyrin…...
基于java新闻管理系统,推荐一款开源cms内容管理系统ruoyi-fast-cms
一、项目概述 1.1 项目背景 在信息高速流通的当下,新闻媒体行业每天都要处理和传播海量信息。传统的新闻管理模式依赖人工操作,在新闻采集、编辑、发布以及后续管理等环节中,不仅效率低下,而且容易出现人为失误。同时࿰…...
054 redisson
文章目录 使用Redisson演示可重入锁读写锁信号量闭锁获取三级分类redisson分布式锁 package com.xd.cubemall.product.config;import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import org.springframework.context…...
【数据结构】(12) 反射、枚举、lambda 表达式
一、反射 1、反射机制定义及作用 反射是允许程序在运行时检查和操作类、方法、属性等的机制,能够动态地获取信息、调用方法等。换句话说,在编写程序时,不需要知道要操作的类的具体信息,而是在程序运行时获取和使用。 2、反射机制…...
java实现二维码图片生成和编解码
java实现二维码图片生成和编解码 在wutool中,封装了二维码工具类,基于google的zxing库,实现二维码图片生成、编码和解码。 关于wutool wutool是一个java代码片段收集库,针对特定场景提供轻量解决方案,只要按需选择代…...
Java基础常见的面试题(易错!!)
面试题一:为什么 Java 不支持多继承 Java 不支持多继承主要是为避免 “菱形继承问题”(又称 “钻石问题”),即一个子类从多个父类继承到同名方法或属性时,编译器无法确定该调用哪个父类的成员。同时,多继承…...
hugging face---transformers包
一、前言 不同于计算机视觉的百花齐放,不同网络适用不同情况,NLP则由Transformer一统天下。transformer是2017年提出的一种基于自注意力机制的神经网络架构,transformers库是hugging face社区创造的一个py库,通过该库可以实现统一…...
网络安全防护指南:筑牢网络安全防线(510)
一、网络安全的基本概念 (一)网络的定义 网络是指由计算机或者其他信息终端及相关设备组成的按照一定的规则和程序对信息收集、存储、传输、交换、处理的系统。在当今数字化时代,网络已经成为人们生活和工作中不可或缺的一部分。它连接了世…...
微信小程序实现拉卡拉支付
功能需求:拉卡拉支付(通过跳转拉卡拉平台进行支付),他人支付(通过链接进行平台跳转支付) 1.支付操作 //支付 const onCanStartPay async (obj) > {uni.showLoading({mask: true})// 支付接口获取需要传…...
git从本地其他设备上fetch分支
在 Git 中,如果你想从本地其他设备上获取分支,可以通过以下几种方式实现。不过,需要注意的是,Git 本身是分布式版本控制系统,通常我们是从远程仓库(如 GitHub、GitLab 等)拉取分支,而…...
【干货教程】Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)
文章目录 一、环境准备二、安装Ollama2.1 访问Ollama官方网站2.2 下载适用于Windows的安装包2.3 安装Ollama安装包2.4 指定Ollama安装目录2.5 指定Ollama的大模型的存储目录 三、选择DeepSeek R1模型四、下载并运行DeepSeek R1模型五、常见问题解答六、使用Chatbox进行交互6.1 …...
基于 SSM框架 的 “捷邻小程序” 系统的设计与实现
大家好,今天要和大家聊的是一款基于 SSM框架 的 “捷邻小程序” 系统的设计与实现。项目源码以及部署相关事宜请联系我,文末附上联系方式。 项目简介 基于 SSM框架 的 “捷邻小程序” 系统设计与实现的主要使用者分为 管理员 和 用户,没有授…...
基于Springboot医院预约挂号小程序系统【附源码】
基于Springboot医院预约挂号小程序系统 效果如下: 小程序主页面 帖子页面 医生账号页面 留言内容页面 管理员主页面 用户管理页面 我的挂号页面 医生管理页面 研究背景 随着信息技术的飞速发展和互联网医疗的兴起,传统的医疗服务模式正面临着深刻的变…...
基于AVue的二次封装:快速构建后台管理系统的CRUD方案
基于AVue的二次封装:快速构建后台管理系统的CRUD方案 在开发后台管理系统时,表格是常见的组件之一。然而,使用原生的Element Plus实现CRUD(增删改查)功能往往需要编写大量重复代码,过程繁琐。即使借助类似…...
【含开题报告+文档+PPT+源码】基于springboot加vue 前后端分离的校园新闻审核发布管理系统
开题报告 本研究旨在设计并实现一套基于SpringBoot后端框架结合Vue前端技术的校园新闻发布系统,该系统面向学生用户群体提供了全面的功能服务。学生用户通过身份验证登录后,能够便捷高效地获取校园内的各类新闻资讯,实时了解校内动态。系统不…...
Qt 是一个跨平台的 C++ 应用程序框架
Qt 是一个跨平台的 C++ 应用程序框架,广泛用于开发图形用户界面(GUI)应用程序,也可以用于开发非 GUI 程序,如命令行工具和控制台应用程序。Qt 提供了丰富的类库和工具,支持多种操作系统,包括 Windows、macOS、Linux 等。 主要特点: 跨平台:Qt 支持多种操作系统,开发…...
2025年SCI一区智能优化算法:真菌生长优化算法(Fungal Growth Optimizer,FGO),提供MATLAB代码
一. 真菌生长优化算法(FGO) 真菌生长优化算法(Fungal Growth Optimizer,FGO)是一种新型的自然启发式元启发式算法,其灵感来源于自然界中真菌的生长行为。该算法通过模拟真菌的菌丝尖端生长、分支和孢子萌发…...
解决Spring Boot中Druid连接池“discard long time none received connection“警告
在使用Spring Boot结合Druid连接池时,开发者可能会遇到"discard long time none received connection"的警告信息。虽然这通常不会影响应用程序的正常运行,但这些警告信息可能会让人感到困扰。本文将探讨这个问题的原因,并提供几种…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...
