JavaScript -- 09. 内置对象的介绍

news2024/9/20 18:54:26

文章目录

  • 内置对象
    • 1 解构赋值
      • 1.1 保留默认值
      • 1.2 接受剩余的所有参数
      • 1.3 对函数执行结果解构
      • 1.4 交换两个变量的值
      • 1.5 二维数组结构
    • 2 对象的解构
      • 2.1 声明对象同时解构对象
      • 2.2 先声明再解构
      • 2.3 解构不存在的属性
      • 2.4 设置解构别名
      • 2.5 设置解构默认值
    • 3 对象的序列化
      • 3.1 对象的序列化
      • 3.2 序列化的作用
      • 3.3 如何进行序列化
      • 3.4 编写JSON的注意事项
    • 4 Map
      • 4.1 Map介绍
      • 4.2 创建一个Map
      • 4.3 常用方法介绍
      • 4.4 将Map转换为数组
      • 4.5 从数组构建Map
      • 4.6 遍历Map
    • 5 Set
      • 5.1 Set介绍
      • 5.2 创建Set
      • 5.3 方法
      • 5.4 遍历Set
      • 5.5 利用Set对数组去重
    • 6 Math
      • 6.1 Math介绍
      • 6.2 常用的常量和方法
      • 6.3 混合使用
    • 7 Date
      • 7.1 Date介绍
      • 7.2 常用方法介绍
      • 7.3 创建指定日期的Date对象
      • 7.4 日期的格式化
    • 8 包装类
    • 9 字符串的方法
      • 9.1 length
      • 9.2 索引
      • 9.3 str.at()
      • 9.4 str.charAt()
      • 9.5 str.concat()
      • 9.6 str.includes()
      • 9.7 str.indexOf() 和 str.lastIndexOf()
      • 9.8 str.startsWith() 和 str.endsWith()
      • 9.9 str.padStart() 和 str.padEnd()
      • 9.10 str.replace() 和 str.replaceAll()
      • 9.11 str.slice() 和 str.substring()
      • 9.12 str.split() 和 str.join()
      • 9.13 str.toLowerCase() 和 str.toUpperCase()
      • 9.14 str.trim() 和 str.trimStart() 和 str.trimEnd()
      • 9.15 str.search()
      • 9.16 str.match() 和 str.matchAll()
    • 10 正则表达式
      • 10.1 正则表达式的介绍
      • 10.2 创建正则表达式
      • 10.3 通过整个表达式检查字符串是否符合规则
      • 10.4 正则表达式的基本语法
      • 10.5 提取符合规则的字符串
      • 10.6 例子
    • 11 垃圾回收

内置对象

这部分内容开始对JS中其他的内建对象进行补充。主要包括:结构复制、序列化、Map、Set、Date、包装类、String、正则表达式以及垃圾回收(GC)

1 解构赋值

案例:将arr分别赋值给a,b,c

基本方法:

const arr = ["孙悟空", "猪八戒", "沙和尚"]

let a,
    b,
    c

a = arr[0]
b = arr[1]
c = arr[2]
console.log(a,b,c)

image-20221203113617271

使用对象解构:

推荐在结构赋值前面手动加分号,防止编译器解析出问题

const arr = ["孙悟空", "猪八戒", "沙和尚"]

let a,
    b,
    c

;[a, b, c] = arr // 解构赋值
console.log(a,b,c)

image-20221203113626216

但是一般使用的时候是声明和赋值在一起的(声明同时结构),但是如果前面参数比后面数组多,会被赋值undefined

let [d, e, f, g] = ["唐僧", "白骨精", "蜘蛛精", "玉兔精"]
console.log(d, e, f, g)

;[d, e, f, g] = ["唐僧", "白骨精", "蜘蛛精"]
console.log(d, e, f, g)

image-20221203114301972

在赋值的时候给定默认值,就可以防止其出现undefined,如果设置了默认值,同时在数组解构的时候可以覆盖掉这个值,那么最终这个值存的是数组中的对应元素

有值就赋值,没有值就用默认值

;[d, e, f=73, g=10] = ["唐僧", "白骨精", "蜘蛛精"]
console.log(d, e, f, g)

image-20221203124609267

1.1 保留默认值

在上面的例子中,g开始有值,但是在结构后又变成undefined了,我们想要的效果是如果可以赋值就赋值,不能赋值就用原来的,这样就可以通过下面这样设置来达到效果

let [d, e, f, g] = ["唐僧", "白骨精", "蜘蛛精", "玉兔精"]
console.log(d, e, f, g)

;[d, e, f, g=g] = ["唐僧", "白骨精", "蜘蛛精"]
console.log(d, e, f, g)

image-20221203124850570

1.2 接受剩余的所有参数

解构数组时,可以使用…来设置获取多余的元素

let [n1, n2, ...n3] = [4, 5, 6, 7]
console.log(n1, n2, n3)

image-20221203125411069

1.3 对函数执行结果解构

function fn() {
    return ["二郎神", "猪八戒"]
}

let [name1, name2] = fn() // "二郎神", "猪八戒"

1.4 交换两个变量的值

let a1 = 10
let a2 = 20

// 原来的做法
let temp = a1
a1 = a2
a2 = temp

// 解构赋值
;[a1, a2] = [a2, a1] // [20, 10]

交换数组中两个元素的位置

const arr2 = ["孙悟空", "猪八戒"]

;[arr2[0], arr2[1]] = [arr2[1], arr2[0]]

1.5 二维数组结构

const arr3 = [["孙悟空", 18, "男"], ["猪八戒", 28, "男"]]

let [[name, age, gender], obj] = arr3

console.log(name, age, gender)
console.log(obj)

image-20221203130959090

2 对象的解构

2.1 声明对象同时解构对象

const obj = { name: "孙悟空", age: 18, gender: "男" }

let { name, age, gender } = obj // 声明变量同时解构对象
console.log( name, age, gender)

image-20221203131639077

2.2 先声明再解构

这个必须得在解构的时候用括号括起来,不然会将大括号解析为代码块,然后会报错

const obj = {name: "孙悟空", age: 18, gender: "男"}

let name, age, gender
;({name, age, gender} = obj)
console.log( name, age, gender)

image-20221203131822783

2.3 解构不存在的属性

const obj = { name: "孙悟空", age: 18, gender: "男" }

let { address } = obj
console.log(address)

image-20221203131916303

2.4 设置解构别名

const obj = { name: "孙悟空", age: 18, gender: "男" }

// 设置别名
let {name: a, age: b, gender: c} = obj
console.log(a, b, c)

image-20221203132044989

2.5 设置解构默认值

const obj = { name: "孙悟空", age: 18, gender: "男" }

// 设置默认值
let {name: a, age: b, gender: c, address: d = "花果山"} = obj
console.log(a, b, c, d)

image-20221203132053301

3 对象的序列化

3.1 对象的序列化

  • JS中的对象使用时都是存在于计算机的内存中的
  • 序列化指将对象转换为一个可以存储的格式,在JS中对象的序列化通常是将一个对象转换为字符串(JSON字符串)

3.2 序列化的作用

  • 对象转换为字符串后,可以将字符串在不同的语言之间进行传递,甚至人可以直接对字符串进行读写操作,使得JS对象可以不同的语言之间传递
  • 用途:
    1. 作为数据交换的格式
    2. 用来编写配置文字

3.3 如何进行序列化

  • 在JS中有一个工具类 JSON (JavaScript Object Notation) JS对象表示法
  • JS对象序列化后会转换为一个字符串,这个字符串我们称其为JSON字符串
const obj = {
    name: "孙悟空",
    age: 18,
}

// 将obj转换为JSON字符串
const str = JSON.stringify(obj) //JSON.stringify() 可以将一个对象转换为JSON字符串

const obj2 = JSON.parse(str) // JSON.parse() 可以将一个JSON格式的字符串转换为JS对象

console.log(typeof str, str)
console.log(typeof obj2, obj2)

image-20221203132629513

3.4 编写JSON的注意事项

  1. JSON字符串有两种类型:
  • JSON对象 {}
  • JSON数组 []
  1. JSON字符串的属性名必须使用双引号引起来
  2. JSON中可以使用的属性值(元素)
  • 数字(Number)
  • 字符串(String) 必须使用双引号,不要使用单引号,单引号在其他语言可能不表示字符串
  • 布尔值(Boolean)
  • 空值(Null)
  • 对象(Object {})
  • 数组(Array [])
  1. JSON的格式和JS对象的格式基本上一致的,注意:JSON字符串如果属性是最后一个,则不要再加,

image-20221203133346779

4 Map

4.1 Map介绍

  • Map用来存储键值对结构的数据**(key-value)**
  • Object中存储的数据就可以认为是一种键值对结构
  • Map和Object的主要区别:
    • Object中的属性名只能是字符串或符号,如果传递了一个其他类型的属性名,JS解释器会自动将其转换为字符串
    • Map中任何类型的值都可以成为数据的key
const obj = {
    "name":"孙悟空",
    'age':18,
    [Symbol()]:"哈哈",
    [obj2]:"嘻嘻"
}

image-20221203134223010

4.2 创建一个Map

const map = new Map()

map.set("name", "孙悟空")
map.set(obj2, "呵呵")
map.set(NaN, "哈哈哈")

map.delete(NaN)
// map.clear()

console.log(map)
console.log(map.get("name"))
console.log(map.has("name"))

image-20221203133950058

4.3 常用方法介绍

  • map.size() 获取map中键值对的数量
  • map.set(key, value) 向map中添加键值对
  • map.get(key) 根据key获取值
  • map.delete(key) 删除指定数据
  • map.has(key) 检查map中是否包含指定键
  • map.clear() 删除全部的键值对
  • map.keys() 获取map的所有的key
  • map.values() 获取map的所有的value

4.4 将Map转换为数组

方法一:使用方法Array.from(map)

const map = new Map()

map.set("name", "孙悟空")
map.set("age", 18)
map.set({}, "呵呵")

// 将map转换为数组
const arr = Array.from(map) // [["name","孙悟空"],["age",18]]
const arr = [...map]

console.log(arr)

image-20221203134706290

方法二:使用解构符

推荐这种方法,写法更简便

const map = new Map()

map.set("name", "孙悟空")
map.set("age", 18)
map.set({}, "呵呵")

// 将map转换为数组
const arr = [...map]

console.log(arr)

image-20221203134714506

4.5 从数组构建Map

const map2 = new Map([
    ["name", "猪八戒"],
    ["age", 18],
    [{}, () => {}],
])
console.log(map2)

image-20221203134819011

4.6 遍历Map

方法一:使用for-of

const map = new Map()

map.set("name", "孙悟空")
map.set("age", 18)
map.set({}, "呵呵")

for (const [key, value] of map) {
    // const [key, value] = entry
    console.log(key, value)
}

方法二:使用forEach

const map = new Map()

map.set("name", "孙悟空")
map.set("age", 18)
map.set({}, "呵呵")

map.forEach((key, value)=>{
    console.log(key, value)
})

5 Set

5.1 Set介绍

  • Set用来创建一个集合
  • 它的功能和数组类似,不同点在于Set中不能存储重复的数据
  • Set存储元素是无序的,不能通过下标访问

5.2 创建Set

  • new Set():构造空Set
  • new Set([...]):从数组构造
const set = new Set()

// 向set中添加数据
set.add(10)
set.add("孙悟空")
set.add(10)

console.log(set)

image-20221203135434108

5.3 方法

  • size() 获取数量
  • add() 添加元素
  • has() 检查元素
  • delete() 删除元素

5.4 遍历Set

方法一:for-of

const set = new Set()

// 向set中添加数据
set.add(10)
set.add("孙悟空")
set.add(10)

for (const item of set) {
    console.log(item)
}

image-20221203135443262

方法二:forEach

const set = new Set()

// 向set中添加数据
set.add(10)
set.add("孙悟空")
set.add(10)

set.forEach(item => {
    console.log(item)
})

image-20221203135419247

5.5 利用Set对数组去重

const arr2 = [1, 2, 3, 2, 1, 3, 4, 5, 4, 6, 7, 7, 8, 9, 10]

const set2 = new Set(arr2)

console.log([...set2])

image-20221203135530309

6 Math

Math - JavaScript

6.1 Math介绍

  • Math一个工具类
  • Math中为我们提供了数学运算相关的一些常量和方法

6.2 常用的常量和方法

  • 常量:

    • Math.PI 圆周率
    • Math.e 自然对数
  • 方法:

    • Math.abs() 求一个数的绝对值

    • Math.min() 求多个值中的最小值

    • Math.max() 求多个值中的最大值

    • Math.pow() 求x的y次幂

    • Math.sqrt() 求一个数的平方根

    • Math.floor() 向下取整

    • Math.ceil() 向上取整

    • Math.round() 四舍五入取整

    • Math.trunc() 直接去除小数位

    • Math.random() 生成一个0-1之间的随机数(前开后闭)

let result = Math.abs(10)
result = Math.abs(-10)

result = Math.min(10, 20, 30, 44, 55, -1)
result = Math.max(10, 20, 30, 44, 55, -1)
result = Math.pow(4, 2) // 4 ** 2
result = Math.sqrt(4) // 4 ** .5

result = Math.floor(1.2)
result = Math.ceil(1.2)
result = Math.round(1.4)
result = Math.trunc(1.5)

6.3 混合使用

  • 生成 0-x之间的随机数:
    • Math.round(Math.random() * x)
    • Math.floor(Math.random() * (x + 1))
  • 生成 x-y 之间的随机数
    • Math.round(Math.random() * (y-x) + x)
// 生成0-5之间的整数
result = Math.round(Math.random() * 5)

// 生成11-20之间的整数
result = Math.round(Math.random() * 9 + 11)

7 Date

Date - JavaScript

7.1 Date介绍

  • 在JS中所有的和时间相关的数据都由Date对象来表示

创建Date对象

let d = new Date() // 直接通过new Date()创建时间对象时,它创建的是当前的时间的对象
console.log(d)

image-20221203140813936

7.2 常用方法介绍

  • getFullYear() 获取4位年份
  • getMonth() 返当前日期的月份(0-11)
  • getDate() 返回当前是几日
  • getDay() 返回当前日期是周几(0-6) 0表示周日
  • getHours 返回当前小时
  • getMinutes 返回当前分钟
  • getSeconds 返回秒
  • getTime() 返回当前日期对象的时间戳
    • 时间戳:自1970年1月1日0时0分0秒到当前时间所经历的毫秒数
    • 计算机底层存储时间时,使用都是时间戳
    • Date.now() 获取当前的时间戳

7.3 创建指定日期的Date对象

方法一

// 月/日/年 时:分:秒
let d = new Date("12/20/1998")
console.log(d)

image-20221203141558596

方法二

// 年-月-日T时:分:秒
let d = new Date("2020-12-30")
console.log(d)

image-20221203141708014

方法三

推荐使用这种方式创建

月从0开始记数

至少需要传两个参数

// new Date(年份, 月, 日, 时, 分, 秒, 毫秒)
let d = new Date(2020, 0, 1, 13, 45, 33)
console.log(d)

image-20221203141920124

方法四

使用时间戳

let timeNow = new Date().getTime()
console.log(timeNow) // 获取当前的时间戳

let d = new Date(timeNow)
console.log(d)

image-20221203142502203

7.4 日期的格式化

// 将日期转换为本地的字符串
console.log(d.toLocaleDateString())

// 将时间转换为本地的字符串
console.log(d.toLocaleTimeString())

// 将时间日期都转
console.log(d.toLocaleString())

image-20221203142847936

toLocaleString()

  • 可以将一个日期转换为本地时间格式的字符串

  • 参数

    • 描述语言和国家信息的字符串

      • zh-CN 中文中国
      • zh-HK 中文香港
      • en-US 英文美国
    • 需要一个对象作为参数,在对象中可以通过对象的属性来对日期的格式进行配置

      配置文档

      • dateStyle 日期的风格
      • timeStyle 时间的风格
        • full
        • long
        • medium
        • short
      • hour12 是否采用12小时值
        • true
        • false
      • weekday 星期的显示方式
        • "long" (e.g., Thursday)
        • "short" (e.g., Thu)
        • "narrow" (e.g., T). Two weekdays may have the same narrow style for some locales (e.g. Tuesday’s narrow style is also T).
      • year
        • "numeric" (e.g., 2012)
        • "2-digit" (e.g., 12)
      • month
        • "numeric" (e.g., 3)
        • "2-digit" (e.g., 03)
        • "long" (e.g., March)
        • "short" (e.g., Mar)
        • "narrow" (e.g., M). Two months may have the same narrow style for some locales (e.g. May’s narrow style is also M).
      • day
        • "numeric" (e.g., 1)
        • "2-digit" (e.g., 01)

image-20221203144026158

8 包装类

在JS中,除了直接创建原始值外,也可以创建原始值的对象,也就是通过对象的时候去创建原始值

  • 通过 new String() 可以创建String类型的对象
  • 通过 new Number() 可以创建Number类型的对象
  • 通过 new Boolean() 可以创建Boolean类型的对象

但是千万不要这么做

let str = new String("hello")
let num = new Number(11)
let bool = new Boolean(true)
let bool2 = new Boolean(true)

console.log(bool == bool2)

image-20221203144454973

上面这种情况比较的是两个对象,所以比较的就是地址,调用两次new创建的对象肯定不是指向同一对象,所以尽量不要使用这种方式

JS中一共有五个包装类

  • String --> 字符串包装为String对象
  • Number --> 数值包装为Number对象
  • Boolean --> 布尔值包装为Boolean对象
  • BigInt --> 大整数包装为BigInt对象
  • Symbol --> 符号包装为Symbol对象

通过包装类可以将一个原始值包装为一个对象,当我们对一个原始值调用方法或属性时,JS解释器会临时将原始值包装为对应的对象,然后调用这个对象的属性或方法

由于原始值会被临时转换为对应的对象,这就意味着对象中的方法都可以直接通过原始值来调用

这个功能是留给js自己处理的,尽量不要自己调用new生成新对象

let num = 11
num = num.toString()
console.log(num)

image-20221203145554455

9 字符串的方法

String文档

字符串其本质就是一个字符数组,所以字符串的很多方法都和数组是非常类似的

"hello" --> ["h", "e", "l", "l", "o"]

9.1 length

length 获取字符串的长度

let str = "hello"
str.length

image-20221203203608946

9.2 索引

字符串[索引] 获取指定位置的字符

let str = "hello"
str[1]

image-20221203203623273

9.3 str.at()

根据索引获取字符,可以接受负索引

let str = "hello"
console.log(str.at(0))
console.log(str.at(-1))
console.log(str.at(-2))

image-20221203203733396

9.4 str.charAt()

根据索引获取字符

不支持负数,传入负数返回的是空串

let str = "hello"
console.log(str.charAt(0))

image-20221203203834538

9.5 str.concat()

用来连接两个或多个字符串

不会破坏原来的字符串,会生成新字符串

+效果一样,推荐使用+

let str = "hello"
console.log(str.concat(" ", "world"))

image-20221203203951389

9.6 str.includes()

  • 用来检查字符串中是否包含某个内容(字符串)
    • 有返回true
    • 没有返回false
  • 第一个参数是要找的内容
  • 第二个参数是查找的起始位置
let str = "hello hello how are you"
console.log(str.includes("hello"))
console.log(str.includes("ttt"))
console.log(str.includes("hello", 10))

image-20221203204400489

9.7 str.indexOf() 和 str.lastIndexOf()

查询字符串中是否包含某个内容,并返回下标,如果没有的话返回-1

第二个参数是查找的起始,不传默认为0

let str = "hello hello how are you"

image-20221203204515290

9.8 str.startsWith() 和 str.endsWith()

检查一个字符串是否以指定内容开头或者结尾的

let str = "hello hello how are you"

image-20221203204635491

9.9 str.padStart() 和 str.padEnd()

通过在开头或者结尾添加指定的内容,使字符串保持某个长度

  • 第一个参数是字符串的位数
  • 第二个参数是要补的符号

如果穿进去的第一个参数比str.length少,则不做任何操作

str = "100"

console.log(str.padStart(7, "0"))
console.log(str.padEnd(7, "0"))

image-20221203204851125

9.10 str.replace() 和 str.replaceAll()

使用一个新字符串替换一个指定内容

str = "hello hello how are you"

let result = str.replace("hello", "abc")
console.log(result)

str = "hello hello how are you"
result = str.replaceAll("hello", "abc")
console.log(result)

image-20221203205936740

使用正则表达式替换

通过指定模式g可以实现全部替换

image-20221203223039741

9.11 str.slice() 和 str.substring()

对字符串进行切片

  • 第一个参数是开始位置
  • 第二个参数是结束位置
  • 前闭后开

substring会自动判断参数,如果第一个参数比第二个参数大,则会自动交换参数位置,slice不会

str = "hello hello how are you"
result = str.slice(12, 15)
result = str.slice(15, 12)
result = str.substring(12, 15)
result = str.substring(15, 12)

image-20221203210404837

9.12 str.split() 和 str.join()

str.split():用来将一个字符串拆分为一个数组

str.join():用来将数组拼接为字符串

  • 参数是分割的符号,也可以根据正则表达式拆分
str = "abc@bcd@efg@jqk"
result = str.split("@")
result = result.join("@"")

image-20221203210753350

根据正则表达式拆分

image-20221203222554303

9.13 str.toLowerCase() 和 str.toUpperCase()

将字符串转为大写或小写

str = "abcdABCD"

result = str.toLowerCase()
result = result.toUpperCase()

image-20221203211151241

9.14 str.trim() 和 str.trimStart() 和 str.trimEnd()

  • str.trim():去除字符串的前后空格
  • str.trimStart():去除开始空格
  • str.trimEnd():去除结束空格
str = "    ab  c     "
str.trim()
str.trimStart()
str.trimEnd()

image-20221203211325655

9.15 str.search()

可以去搜索符合正则表达式的内容第一次在字符串中出现的位置

image-20221203222845262

9.16 str.match() 和 str.matchAll()

  • str.match():根据正则表达式去匹配字符串中符合要求的内容
  • str.matchAll():根据正则表达式去匹配字符串中符合要求的内容(必须设置g 全局匹配),返回的是一个迭代器

str.match()可以通过设置全局模式g来匹配所有符合的字符串,并以数组的形式返回

image-20221203223229801

str.matchAll()如果不使用全局模式的话会报错,返回的是一个迭代器,使用for-of遍历可以打印结果

image-20221203223802189

10 正则表达式

10.1 正则表达式的介绍

  • 正则表达式用来定义一个规则
  • 通过这个规则计算机可以检查一个字符串是否符合规则或者将字符串中符合规则的内容提取出来
  • 正则表达式也是JS中的一个对象,所以要使用正则表达式,需要先创建正则表达式的对象
  • typeof 返回的是object

10.2 创建正则表达式

通过构造函数创建:new RegExp()

可以接收两个参数(字符串) 1.正则表达式 2.匹配模式

使用这种方式js编译器会自动将我们的这种写法去转化和字面量相同的方式

优势:可以传递变量,动态生成自责表达式

let reg = new RegExp("a", "i") // 通过构造函数来创建一个正则表达式的对象
console.log(reg)

image-20221203212609652

使用字面量来创建:

// 创建和上面相同的正则
let reg = /a/i
console.log(reg)

image-20221203212705910

使用构造函数的形式需要考虑转义字符,在字面量中可以直接写

let reg = /\w/
reg = new RegExp("\\w") // 如果只写 \w 的话会转义成 w,就表示字母w

10.3 通过整个表达式检查字符串是否符合规则

let str = "a"
let reg = new RegExp("a")// 表示检查一个字符串中是否含有a
// let reg = /a/ // 也可以使用这种方式定义

let result = reg.test(str) // true
result = reg.test("b") // false
result = reg.test("abc") // true
result = reg.test("bcabc") // true

10.4 正则表达式的基本语法

  1. 在正则表达式中大部分字符都可以直接写

  2. | 在正则表达式中表示或(整体的或)

    • /abc|bcd/表示有abc或者bcd这两个字符串
  3. [] 表示或(字符集)

    • [a-z] 任意的小写字母
    • [A-Z] 任意的大写字母
    • [a-zA-Z] 任意的字母
    • [0-9]任意数字
  4. [^] 表示除了

    • [^x] 除了x
  5. . 表示除了换行外的任意字符

  6. 在正则表达式中使用\作为转义字符

  7. 使用括号进行分组

  8. 其他的字符集

    • \w 任意的单词字符,相当于 [A-Za-z0-9_]

    • \W 除了单词字符,相当于 [^A-Za-z0-9_]

    • \d 任意数字,相当于 [0-9]

    • \D 除了数字,相当于 [^0-9]

    • \s 空格

    • \S 除了空格

    • \b 单词边界

    • \B 除了单词边界

  9. 开头和结尾

    • ^ 表示字符串的开头

    • $ 表示字符串的结尾例子

  10. 量词

    • 只对前面紧接的一个字符起作用
    • {m} 正好m个
    • {m,} 至少m个
    • {m,n} m-n个
    • +一个以上,相当于{1,}
    • *任意数量的a
    • ? 0-1次,相当于{0,1}

10.5 提取符合规则的字符串

使用re.exec()获取字符串中符合正则表达式的内容

案例:对于str = "abcaecafcacc"提取出str中符合axc格式的内容

默认情况下只会匹配第一个,通过设置模式g来开启全局匹配

let str = "abcaecafcacc"

let re = /a([a-z])c/g
let result = re.exec(str)
console.log(result)

不开启全局匹配g模式,每次匹配的都是第一个

image-20221203221658735

开启全局匹配g模式:从头一直匹配到尾

image-20221203221640009

在正则表达式中添加括号表示分组,因此我们现在可以拿到中间的字母(返回数组的第二个元素):

如果有多个括号的话,返回的顺序是按照左括号出现的顺序返回的

image-20221203221917966

获取所有的匹配到的结果,使用循环可以实现

let str = "abcaecafcacc"

let re = /a([a-z])c/g
let result = re.exec(str)

while(result){
    console.log(result[0], result[1])
    result = re.exec(str)
}

image-20221203222120231

10.6 例子

  1. 检查字符串中有没有字符串ab
re = /ab/
re.test("abc")

image-20221203215010958

  1. 检查字符串中有没有a或b

方法一:使用|

image-20221203215113172

方法二:使用[]

image-20221203215345627

  1. 检查字符串中有没有小写字母

image-20221203215515315

  1. 检查字符串中有没有除了小写字母之外的符号

image-20221203215824435

  1. 检查字符串中是否以m开头或者结尾

image-20221203220358652

  1. 检查字符串是不是abc

image-20221203220543090

  1. 检查字符串中是否有连续出现三次ab

image-20221203220943835

11 垃圾回收

垃圾回收(Garbage collection,gc)

  • 和生活一样,生活时间长了以后会产生生活垃圾,程序运行一段时间后也会产生垃圾
  • 在程序的世界中,什么是垃圾?
    • 如果一个对象没有任何的变量对其进行引用,那么这个对象就是一个垃圾
    • 垃圾对象的存在,会严重的影响程序的性能
    • 在JS中有自动的垃圾回收机制,这些垃圾对象会被解释器自动回收,我们无需手动处理
    • 对于垃圾回收来说,我们唯一能做的事情就是将不再使用的变量设置为null

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/58377.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OpenCV-Python】教程:3-15 分水岭图像分割

OpenCV Python 分水岭图像分割 【目标】 学习使用分水岭方法进行基于标记的图像分割cv2.watershed() 【理论】 任何灰度图像都可以被视为地形表面,其中高强度表示山峰和丘陵,而低强度表示山谷,。你开始用不同颜色的水(标签&am…

耗时4个月,阿里架构师打造Java面试突击文档,10位朋友已拿offer

不论是校招还是社招都避免不了各种面试、笔试,如何去准备这些东西就显得格外重要。不论是笔试还是面试都是有章可循的,我这个有章可循”说的意思只是说应对技术面试是可以提前准备。运筹帷幄之后,决胜千里之外!不打毫无准备的仗 …

数据结构与算法(六) 贪心算法

这篇文章来讲贪心算法(Greedy Algorithm),这是一种特殊的动态规划算法 1、本质 我们在之前的文章中讲过,动态规划可以解决一类具有最优子结构和重叠子问题特征的问题 贪心算法本质上是一种特殊的动态规划算法,因此在…

微前端:qiankun的五种通信方式

背景 今天盘点一下 qiankun 父子应用的通信方式都有哪些,我发现了 5 种。 1、localStorage/sessionStorage 2、通过路由参数共享 3、官方提供的 props 4、官方提供的 actions 5、使用vuex或redux管理状态,通过shared分享 接下来我们一个一个进行说明 …

S/4HANA(本地部署或云版)跟 SAP 家族系统以及非SAP系统的集成,到底什么是推荐的方式?

笔者的知识星球,有朋友提问: S4HANA(本地部署或云版)跟SAP家族系统以及非SAP系统的集成,sap的标准/推荐做法是通过BTP还是直接连接,或者是根据目标系统分别选择?有参考链接最好了。 首先 SAP S/4HANA 的技术栈&#xf…

java数组应用(栈和队列以及酒店模拟)

1.编写程序,使用一维数组,模拟栈数据结构 要求1.栈内可以存放任意数据2.栈内提供push方法模拟压栈3.栈内提供pop方法模拟出栈4.栈的大小默认为10 新建MyStack类 /*** author DeYou* date 2022/11/10 23:01*/ public class MyStack {Object[] element;int index;public MyStack…

blender Eevee渲染器

文章目录简介.采样.环境光遮蔽.辉光.景深.次表面散射.屏幕空间反射.间接光照明.阴影.体积.简介. 1 EV渲染器是实时渲染,类似于游戏引擎,效果差于Cycles 2 EV渲染器使用的设备是显卡 采样. 1 渲染和视图分别指渲染模式和视图模式的采样值,值越大&#…

Android Studio 中MotinLayout的简单使用

​ 一、什么是MotionLayout MotionLayout 是一种布局类型,可帮助您管理应用中的运动和微件动画。MotionLayout 是 ConstraintLayout 的子类,在其丰富的布局功能基础之上构建而成。 二、使用MotionLayout的准备 1.添加MotionLayout依赖项 要在项目中使用…

【菜鸡读论文】Face2Exp: Combating Data Biases for Facial Expression Recognition

【菜鸡读论文】Face2Exp: Combating Data Biases for Facial Expression Recognition 最近上海开始降温了,而且常常下雨,天气开始变得好冷啊!以前年轻的时候冬天经常穿的少,现在膝盖开始有点遭不住了,小伙伴们一定要保…

Go字符串拼接6种方式及其性能测试:strings.builder最快

Go字符串拼接常见的方式有加号、fmt.Sprintf、strings.Builder、bytes.Buffer、strings.join、切片。 package concat_stringimport ("bytes""fmt""strconv""strings""testing" )const numbers 100// func BenchmarkStri…

Kafka安装与配置

1、Java环境为前提 (1)上传jdk-8u261-linux-x64.rpm到服务器并安装: rpm -ivh jdk-8u261-linux-x64.rpm (2)配置环境变量: vim /etc/profile # 生效 source /etc/profile # 验证 java -version 2、Zook…

贝叶斯定理~~概率分布

还是搬来了基础自己学习用哦 ~~ 从最基础的概率论到各种概率分布全面梳理了基本的概率知识与概念,这些概念可能会帮助我们了解机器学习或开拓视野。这些概念是数据科学的核心,并经常出现在各种各样的话题上。重温基础知识总是有益的,这样我们…

适应性哈夫曼编码(Adaptive Huffman coding)

适应性哈夫曼编码适应性哈夫曼编码简介算法示例适应性哈夫曼编码 简介 适应性哈夫曼编码(Adaptive Huffman coding),又称动态哈夫曼编码(Dynamic Huffman coding),是基于哈夫曼编码的适自适应编码技术。它…

深度学习Day07

Recurrent Neural Network 智慧客服——Slot Filling 根据上 下文产生不同的output

Java搭建宝塔部署实战毕设项目WMS仓库管理系统源码

大家好啊,我是测评君,欢迎来到web测评。 本期给大家带来一套Java开发的毕业设计项目WMS仓库管理系统源码。 技术架构 技术框架:SpringMVC Mybatis Ehcache bootstrap jquery mysql5.7运行环境:jdk8 nginx1.20 tomcat9 In…

基于PSO粒子群算法的MPPT最大功率跟踪Simulink仿真,PSO采用S函数实现

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 MPPT控制器的全称是“最大功率点跟踪”(Maximum Power Point Tracking)太阳能控制器,是传统太阳能充放电控制器的升级换代产品。MPPT控制器能够实时侦测太阳能…

30岁自学Python转行靠谱吗?

前言 30岁自学Python转行靠谱吗?若啃学习任何时候都不晚,关键是学习完用来做什么。提高工作效率,写些脚本实现自动化办公这些完全没问题。如果学python是为了转开发,建议慎重考虑,程序开发转Python相对容易些&#xf…

[附源码]计算机毕业设计血库管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

计算机网络——运输层【重点】

运输层概述 概念 进程之间的通信 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时&…

【SpingBoot拦截器】实现两个接口,配置拦截路径

文章目录SpingBoot拦截器拦截器与过滤器的区别:1.HandlerInterceptor接口2.WebMvcConfigurer接口3.示例:SpingBoot拦截器 【SpringWeb框架中的拦截器作用类似于过滤器,都可以对一个请求进行拦截处理。】 我们可以用拦截器做很多事情&#xf…