正则表达式
定义
用于匹配字符串中字符组合的模式,正则表达式也是对象
通常用来查找、替换那些符合正则表达式的文本
正则表达式在 JavaScript中的使用场景:
- 例如验证表单:用户名表单只能输入英文字母、数字或者下划线,昵称输入枢中可以输入中文(匹配),比如用户名:/^[a-z0-9 -{3,16}s/
- 过滤掉页面内容中的一些敏感词(替换),或从字符出中获取我们想要的特定部分(提取)等
语法
1.定义规则
const 变量名 = /表达式/
//是正则表达式的字面量
2.检测是否匹配
text() 返回值:true或false
console.log(reg.test(被检测的字符串))
const str = '我们在学习前端'
const reg = /前端/
console.log(reg.test(str))
exec() 返回数组
元字符
- 普通字符: 大多数的字符仅能够描述它们本身,这些字符称作普通字符,例如所有的字母和数字,也就是说普通字符只能够匹配字符出中与它们相同的字符。
- 元字符(特殊字符):一些具有特殊含义的字符,可以极大提高了灵活性和强大的匹配功能。比如,规定用户只能输入英文26个英文字母,普通字符的话 abcdefghijklm.但是换成元字符写法:[a-z]
分类
- 边界符(表示位置,开头和结尾,必须用什么开头,用什么结尾)
- 量词 (表示重复次数)
- 字符类(比如 \d 表示 0~9)
1.边界符
提示字符所处的位置
^ | 表示匹配行首的文本(以谁开始) |
$ | 表示匹配行尾的文本(以谁结束) |
如果^和$在一起,要精确匹配,只能有一个
2.量词
设定某个模式出现的次数
* | 出现>=0次 |
+ | >=1 |
? | 0次或1次 |
{} | 写几就出现几次 |
{n,} | >=n |
{n,m} | >=n&&<=m 逗号之间不能有空格 |
3.字符类
[]:匹配字符集合
例:
console.log(/[abc]/.test(andy))
后面的字符串只要包含abc中任意一个字符,都返回true
- [a-z]表示a到z26个英文字母都可以
- [a-zA-Z]表示大小写都可以
- [0-9]表示 0~9 的数字都可以
- [^a-z]表示出来a到z26个英文字母都可以 写在中括号里面取反
- . 除了换行符
预定义类
\d | 匹配0-9之间的任一数字 相当于[0-9] |
\D | 匹配除0-9以外的字符 相当于[^0-9] |
\w | 匹配任意字母、数字和下划线 相当于[A-Za-z0-9] |
\W | 除字母、数字和下划线以外的字符 相当于[^A-Za-z0-9] |
\s | 匹配空格(包括换行符、制表符、空格符等) 相当于[\t\r\n\r\f] |
\S | 除空格(包括换行符、制表符、空格符等)以外的字符 相当于[^\t\r\n\r\f] |
练习
作用域
规定变量被访问的范围,离开了这个范围变量不能被访问
局部作用域
1.函数作用域
- 在函数内部声明的变量只能在函数内部被访问,外部无法直接访问
- 函致的参数也是函数内部的局部变量
- 不同函数内部声明的变量无法互相访问
- 函致执行完毕后,函数内部的变量实际被清空了
2.块作用域
在JS中,被{}包裹的代码称为代码块,在块作用域声明的变量,外面可能无法被访问
let 和 const 声明的都有块作用域
注意:var声明的变量无块作用域
全局作用域
<script> 标签 和 ,Js 文件 的【最外层】就是所谓的全局作用域,在此声明的变量在函数内部也可
以被访问。全局作用域中声明的交量,任何其它作用域都可以被访问
作用域链
作用域链本质上是底层的变量查找机制
在函致被执行时,会优先查找当前函数作用域中查找变量
如果当前作用域查找不到则会依次逐级查找父级作用域直到全局作用域
JS垃圾回收机制
垃圾回收机制:简称 GCJS中内存的分配和回收都是自动完成的,内存在不使用
的时候会被垃圾回收器自动回收
内存的生命周期
- 内存分配: 当我们声明变量、函数、对象的时候,系统会自动为他们分配内存
- 内存使用: 即读写内存,也就是使用变量、函数等
- 内存回收: 使用完毕,由垃圾回收器自动回收不再使用的内存
说明:
- 全局变量一般不会回收(关闭页面回收)
- 一般情况下局部变量的值,不用了,会被自动回收掉
内存泄漏: 程序中分配的内存由于某种原因程序未释放或无法释放
堆栈空间分配区别
- 栈(操作系统):由操作系统自动分配释放函数的参数值、局部变量等,基本数据类型放到栈里
- 堆(操作系统):一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收。复杂数据类型放到堆里面
算法
- 引用计数:这是一种简单直观的垃圾回收算法。当对象被引用时,其引用计数增加;当引用被删除或超出作用域时,引用计数减少。当引用计数降为零时,垃圾回收器就会回收该对象的内存。然而,引用计数有一个主要的问题,即循环引用。如果两个对象相互引用,即使它们在其他地方都不可达,引用计数也不会为零,因此垃圾回收器不会回收它们。
- 标记清除:为了解决引用计数的问题,JavaScript引入了标记清除算法。这种算法将“可达”的对象标记为活动的,而“不可达”的对象则会被视为垃圾进行回收。标记清除算法分为两个阶段:标记阶段和清除阶段。在标记阶段,从根(通常是全局对象)开始遍历所有可达的对象,并将它们标记为活动的。在清除阶段,垃圾回收器会回收所有未被标记的对象。
闭包
概念:一个函致对周围状态的引用捆绑在一起,内层函致中访问到其外层函致的作用域
简单理解:闭包= 内层函数+外层函数的变量
常见闭包形式:外部可以访问使用函数内部的变量
变量提升
主要涉及到变量和函数的声明与定义在代码执行过程中的处理方式。当JavaScript代码执行时,变量和函数的声明会被提升到其所在作用域的顶部,但只是声明被提升,初始化还在原来的位置。这意味着你可以在声明之前的代码中访问变量,但此时变量的值是undefined,因为初始化还在原来的位置。
需要注意的是,只有使用var关键字声明的变量会发生变量提升,使用let和const声明的变量具有块级作用域,不会发生变量提升。
函数剩余参数
1.动态参数
arguments 是函数内部内置的伪数组变量,它包含了调用数时传入的所有实参
- arguments 是一个伪数组,只存在于函数中
- arguments 的作用是动态获取的数的实参
- 可以通过for循环依次得到传递过来的实参
2.剩余参数
- ..是语法符号,置于最末函数形参之前,用于获取多余的实参
- 借助…. 获取的剩余实参,是个真数组
展开运算符
剩余参数:函致参数使用,得到真数组
展开运算符:数组中使用,数组展开
const arr=[1,2,3]
console.log(Math.max(...arr))
console.log(Math.min(...arr))