数组解构#
const arr = ["1","2","3"]
let a,b,c
[a,b,c] = arr
console.log(a,b,c)
let [a,b,c] = ["1","2","3"]
console.log(a,b,c)
const arr = ["1","2","3"]
let [a,b,c,d] = arr
console.log(a,b,c,d)
const arr = ["1","2","3"]
let [a,b,c=10,d=11] = arr
console.log(a,b,c,d)
const arr = ["1","2","3","4","5"]
let [a,b, ...c] = arr
console.log(a)
console.log(b)
console.log(c)
const arr = [[1,2,3],[4,5,6]]
let [[a,b,c],obj] = arr
console.log(a,b,c)
console.log(obj)
对象解构#
const user = {"name":"q",age:18}
let {name,age} = user
console.log(name,age)
const user = {"name":"q",age:18}
let name,age
({name,age} = user)
console.log(name,age)
const user = {"name":"q",age:18}
let {a,b} = user
console.log(a,b)
let {name:c,age:d=20} = user
console.log(c,d)
对象的序列化#
JS中的对象使用时都是存在于计算机的内存中的,序列化指将对象转换为一个可以存储的格式,在JS中对象的序列化通常是将一个对象转换为字符串(JSON字符串)
const user = {name:"l",age:18}
const strUser = JSON.stringify(user)
console.log(strUser)
const objUser = JSON.parse(strUser)
console.log(objUser)
编写JSON的注意事项:
JSON字符串有两种类型:
JSON字符串的属性名必须使用双引号引起来
JSON中可以使用的属性值(元素)
- 数字(Number)
- 字符串(String) 必须使用双引号
- 布尔值(Boolean)
- 空值(Null)
- 对象(Object {})
- 数组(Array [])
const strUser = JSON.stringify(user)
const objUser = JSON.parse(strUser)
Map#
Map用来存储键值对结构的数据(key-value)
Object中存储的数据就可以认为是一种键值对结构
Map和Object的主要区别:
- Object中的属性名只能是字符串或符号,如果传递了一个其他类型的属性名,JS解释器会自动将其转换为字符串
- Map中任何类型都可以称为数据的key
map的使用#
const info = new Map()
info.set("name","l")
info.set({},"a")
info.set(NaN,"b")
console.log(info)
console.log(info.size)
console.log(info.keys())
console.log(info.values())
console.log(info.has(NaN))
console.log(info.get("name"))
info.delete("name")
console.log(info)
info.clear()
console.log(info)
map的转换#
const info = new Map()
info.set("name","l")
info.set({},"a")
info.set(NaN,"b")
const arr = Array.from(info)
console.log(arr)
const arr = [["name",1],["age",2]]
const map = new Map(arr)
console.log(map)
遍历map#
const info = new Map()
info.set("a",1)
info.set("b",2)
for (const entry of info){
const [key,value] = entry
console.log(key,value)
}
for (const [key,value] of info){
console.log(key,value)
}
info.forEach((key,value)=>{
console.log(key,value)
})
Set#
- Set用来创建一个集合
- 它的功能和数组类似,不同点在于Set中不能存储重复的数据
const set = new Set()
set.add("a")
set.add("b")
console.log(set.size)
console.log(set.has("a"))
const arr = [...set]
console.log(arr[0])
set.delete("b")
for (const v of set){
console.log(v)
}
const arr = [1,2,3,4,4,1,1,5]
const set = new Set(arr)
console.log(set)
Math#
Math是一个工具类,提供了数学运算的一些常量和方法
用法大全
console.log(Math.PI)
console.log(Math.abs(-123))
console.log(Math.min(1, 2, 3))
console.log(Math.max(1,2,3))
console.log(Math.pow(2,3))
console.log(Math.sqrt(4))
console.log(Math.floor(1.5))
console.log(Math.ceil(1.5))
console.log(Math.round(3.5))
console.log(Math.trunc(3.5))
console.log(Math.random())
console.log(Math.round(Math.random() * 5))
console.log(Math.round(Math.random() * 5 + 1))
console.log(Math.round(Math.random() * 9 + 11))
Date#
在JS中所有的和时间相关的数据都由Date对象来表示
用法大全
Date使用#
let date = new Date()
console.log(date)
date = new Date(2024,9,30,13,13,13,13)
console.log(date)
date = new Date("2024-10-30 12:00:00")
console.log(date)
date = new Date(1730265193013)
console.log(date)
console.log(date.getFullYear())
console.log(date.getMonth())
console.log(date.getDate())
console.log(date.getDay())
console.log(date.getTime())
console.log(Date.now())
Date格式化#
let date = new Date()
let time = date.toLocaleDateString()
console.log(time)
time = date.toLocaleTimeString()
console.log(time)
time = date.toLocaleString()
console.log(time)
time = date.toLocaleString(
"en-US",
{dateStyle: "full", timeStyle: "full"}
)
console.log(time)
包装类#
在JS中,除了直接创建原始值外,也可以创建原始值的对象
let str = new String("hello world")
let num = new Number(10)
let bool = new Boolean(true)
num.max = 100
console.log(str)
console.log(num)
console.log(num.max)
console.log(bool)
console.log(num === 10)
包装类:
- JS中一共有5个包装类
- String --> 字符串包装为String对象
- Number --> 数值包装为Number对象
- Boolean --> 布尔值包装为Boolean对象
- BigInt --> 大整数包装为BigInt对象
- Symbol --> 符号包装为Symbol对象
通过包装类可以将一个原始值包装为一个对象
当我们对一个原始值调用方法或属性时,JS解释器会临时将原始值包装为对应的对象,然后调用这个对象的属性或方法
let str = "hello world"
str.name = "11111"
console.log(str.name)
let num = 100
num = num.toString()
由于原始值会被临时转换为对应的对象,这就意味着原始值对象中的方法都可以直接通过原始值来调用
let str = "hello"
console.log(str[0])
for (let char of str){
console.log(char)
}
console.log(str.length)
console.log(str.at(-1))
console.log(str.charAt(0))
console.log(str.concat(" world"," !"))
console.log(str.includes("ll"))
console.log(str.includes("h",2))
console.log(str.indexOf("l"))
console.log(str.lastIndexOf("l"))
console.log(str.startsWith("he"))
console.log(str.endsWith("o"))
console.log(str.padStart(7,"0"))
console.log(str.padEnd(8,"0"))
console.log(str.replace("l","a"))
console.log(str.replaceAll("l","a"))
console.log(str.slice(1,3))
console.log(str.substring(1,3))
console.log(str.split(""))
console.log(str.toLowerCase())
console.log(str.toLocaleUpperCase())
console.log(str.trim())
console.log(str.trimStart())
console.log(str.trimEnd())
正则表达式#
- 正则表达式用来定义一个规则
- 通过这个规则计算机可以检查一个字符串是否符合规则或者将字符串中符合规则的内容提取出来
- 正则表达式也是JS中的一个对象,所以要使用正则表达式,需要先创建正则表达式的对象
创建正则表达式对象#
let regObj = new RegExp("\\w","i")
let reg = /\w/i
let reg2 = new RegExp("a")
console.log(reg2.test("abc"))
正则表达式语法#
let re = /abc|bcd/
re = /[abc]/
re = /[a-z]/
re = /[A-Z]/
re = /[a-zA-Z]/
re = /[0-9]/
re = /[^a]/
re = /./
re = /\w/
re = /\W/
re = /\d/
re = /\D/
re = /\s/
re = /\S/
re = /\b/
re = /\B/
re = /^a/
re = /a$/
re = /^a$/
let re = /a{3}/
re = /a{3,}/
re = /a{3,6/
re = /(ab){3}/
re = /^[a-z]{3}/
re = /a+/
re = /a*/
re = /a?/
正咋表达式匹配模式#
- 默认(贪婪模式)
- 在 JavaScript 正则表达式中,默认情况下量词(如
*
、+
、?
)是贪婪的。这意味着它们会尽可能多地匹配字符。 - 例如,对于正则表达式
/a.*b/
和字符串"aabbbc"
,它会匹配从第一个a
到最后一个b
的整个字符串,即"aabbbc"
。因为.*
会尽可能多地匹配中间的字符,直到遇到最后一个b
。
- 非贪婪模式(懒模式)
- 通过在量词后面添加
?
可以将其转换为非贪婪模式。在非贪婪模式下,量词会尽可能少地匹配字符。 - 例如,对于正则表达式
/a.*?b/
和字符串"aabbbc"
,它会匹配"aab"
。因为.*?
会在遇到第一个b
时就停止匹配,只匹配最少的字符来满足表达式。
- 全局匹配模式(
g
)- 当在正则表达式末尾添加
g
标志(如/pattern/g
)时,它会进行全局匹配。这意味着会在整个字符串中查找所有匹配的部分,而不是只找到第一个匹配就停止。 - 例如,对于正则表达式
/a/g
和字符串"aaab"
,它会匹配所有的a
,返回一个包含三个a
的数组(在使用match
方法时)。如果没有g
标志,只会返回第一个a
。
- 不区分大小写匹配模式(
i
)- 在正则表达式末尾添加
i
标志(如/pattern/i
)会使匹配不区分大小写。 - 例如,对于正则表达式
/a/i
和字符串"Aa"
,它会匹配A
,因为不区分大小写。
- 多行匹配模式(
m
)- 当添加
m
标志(如/pattern/m
)时,^
和$
的匹配行为会发生改变。^
不仅可以匹配字符串开头,还可以匹配每一行的开头;$
不仅可以匹配字符串结尾,还可以匹配每一行的结尾。 - 例如,对于正则表达式
/^a/m
和字符串"a\nb"
,它会匹配第一行开头的a
,如果没有m
标志,它只会匹配整个字符串开头的a
,对于这个例子就不会匹配
正则表达式提取#
exec()用于获取字符串中符合正则表达式的内容
let str = "abc123bcc456cbdd"
let re = /\d+/ig
console.log(re.exec(str))
console.log(re.exec(str))
console.log(re.exec(str))
str = "abcadcacc"
re = /a([a-z])c/
console.log(re.exec(str))
字符串的正则方法#
let str = "llaacqqabcccaccdd"
console.log(str.split(/a[a-z]c/))
console.log(str.replace(/a[a-z]c/g,"@"))
console.log(str.search(/a[a-z]c/))
console.log(str.match(/a/g))
console.log(str.matchAll(/a/g))
垃圾回收机制#
- 如果一个对象没有任何的变量对其进行引用,那么这个对象就是一个垃圾对象
- 垃圾对象的存在,会严重的影响程序的性能
- 在JS中有自动的垃圾回收机制,这些垃圾对象会被解释器自动回收,我们无需手动处理
- 对于垃圾回收来说,我们唯一能做的事情就是将不再使用的变量设置为null
let obj = { value: 1 };
let anotherObj = obj;
obj = null;
anotherObj = null;