數組解構#
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;