前端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"的警告信息。虽然这通常不会影响应用程序的正常运行,但这些警告信息可能会让人感到困扰。本文将探讨这个问题的原因,并提供几种…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...