Skip to content

JavaScript 文档

JavaScript Array数组

JavaScript 数组的尾插和尾删法

  • push 就是我们的数组的尾插法
  • pop 就是我们的数组的尾删法
javascript
const arr = [1,2,3,4,5]

// 开始我们的尾插法
arr.push(6)
console.log(arr)

// 开始我们的尾删法
arr.pop()
console.log(arr)

JavaScript 数组的头插和头删法

  • unshift 就是我们的数组的头插法
  • shift 就是我们的数组的头删法
javascript
const arr = [1,2,3,4,5]

// 开始我们的头插法
arr.unshift(0)
console.log(arr)

// 开始我们的头删法
arr.shift()
console.log(arr)

JavaScript splice 方法的使用

  • splice 方法可以添加和删除数组元素
  • splice(start, deleteCount, item1, item2, ...)
javascript
const arr = [1,2,3,4,5]
arr.splice(2, 0, 6, 7, 8)  // 实现的插入6、7、8 到数组的第3个位置

JavaScript 数组遍历

  • for...in 遍历数组,遍历数组的索引
  • for...of 遍历数组,遍历数组的元素
javascript
const arr = [1,2,3,4,5]
for(let i in arr) {
    console.log(i)
}
for(let i of arr) {
    console.log(i)
}
for(let i in arr) {
    console.log(arr[i])
}
for(let i of arr) {
    console.log(i)
}

JavaScript 数组slice方法

  • slice 方法可以截取数组的一部分
javascript
const arr = [1,2,3,4,5]
console.log(arr.slice(1,3))

JavaScript 数组join方法

  • join 方法可以连接数组的元素
javascript
const arr = [1,2,3,4,5]
console.log(arr.join('-'))

JavaScript 数组reverse方法

  • reverse 方法可以反转数组的元素
javascript
const arr = [1,2,3,4,5]
console.log(arr.reverse())

JavaScript 数组concat方法

  • concat 方法可以连接两个或者多个数组
javascript
const arr1 = [1,2,3]
const arr2 = [4,5,6]
const arr3 = [7,8,9]
console.log(arr1.concat(arr2, arr3))

JavaScript 数组find方法

  • find 方法可以查找数组中的元素
javascript
const arr = [1,2,3,4,5]
console.log(arr.find(item => item === 3))

const inventory = [
    { name: "apples", quantity: 2 },
    { name: "bananas", quantity: 0 },
    { name: "cherries", quantity: 5 },
]

const res = inventory.find((item, index) => {
    if(item.name==="apples") return item
})

JavaScript 数组findIndex方法

  • findIndex 方法可以查找数组中的元素下标
javascript
const arr = [1,2,3,4,5]
console.log(arr.findIndex(item => item === 3))

const inventory = [
    { name: "apples", quantity: 2 },
    { name: "bananas", quantity: 0 },
    { name: "cherries", quantity: 5 },
]

const res = inventory.findIndex((item, index) => {
    if(item.name==="apples") return index
})

JavaScript 数组forEach方法

  • forEach 方法可以遍历数组的元素
javascript
const arr = [1,2,3,4,5]
arr.forEach(item => {
    console.log(item)
})

const inventory = [
    { name: "apples", quantity: 2 },
    { name: "bananas", quantity: 0 },
    { name: "cherries", quantity: 5 },
]
inventory.forEach((item, index) => {
    console.log(item.name, index)
})

JavaScript 数组map方法

  • map 方法可以遍历数组的元素,并返回一个新数组
javascript
const arr = [1,2,3,4,5]
const newArr = arr.map(item => {
    return item * 2
})

const inventory = [
    { name: "apples", quantity: 2 },
    { name: "bananas", quantity: 0 },
    { name: "cherries", quantity: 5 },
]
const res = inventory.map((item, index) => {
    return item.quantity * 2
})

JavaScript 数组filter方法

  • filter 方法可以遍历数组的元素,并返回一个新数组
javascript
const arr = [1,2,3,4,5]
const newArr = arr.filter(item => {
    return item > 2
})

const inventory = [
    { name: "apples", quantity: 2 },
    { name: "bananas", quantity: 0 },
    { name: "cherries", quantity: 5 },
]
const res = inventory.filter((item, index) => {
    return item.quantity >= 2
})

JavaScript 数组reduce方法

  • reduce 就是可以实现的是我们的将数组中的 item 实现累操作
javascript
const arr = [1,2,3,4,5]
const res = arr.reduce((pre, cur) => {
    return pre + cur
}, 0)

const inventory = [
    { name: "apples", quantity: 2 },
    { name: "bananas", quantity: 0 },
    { name: "cherries", quantity: 5 },
]
const res = inventory.reduce((pre, cur) => {
    return pre + cur.quantity
}, 0)

JavaScript 数组sort方法

  • sort 方法可以排序数组的元素
javascript
const arr = [1,2,3,4,5]
arr.sort((a, b) => a - b)
arr.sort((a, b) => a + b)

JavaScript 数组includes方法

  • includes 方法可以判断数组中是否存在某个元素
javascript
const arr = [1,2,3,4,5]
console.log(arr.includes(3))

JavaScript 数组flat方法

  • flat 方法可以扁平化数组
javascript
const arr = [1,2,3,[4,5,6],[7,8,9]]
console.log(arr.flat(isFinite))  // 实现的是无线递归平展

JavaScript 数组flatMap方法

  • flatMap 方法可以扁平化数组,并返回一个新数组
javascript
const arr = [1,2,3,[4,5,6],[7,8,9]]
console.log(arr.flatMap(item => item))

JavaScript Map 对象

  • Map 对象可以存储键值对,并且可以迭代
  • vue3 响应式原理中,该数据结构和 reflect 和 proxy 联合实现了我们的数据响应式原理
javascript
const map = new Map()  // 创建一个空的 Map 对象

map.set('name', '张三')  // 设置键值对

map.get('name')  // 获取键值对

map.has('name')  // 判断键值对是否存在

map.delete('name')  // 删除键值对

map.clear()  // 清空 Map 对象

for(let [key, value] of map) {  // 遍历 Map 对象
    console.log(key, value)  
}

JavaScript WeakMap 对象

  • WeakMap 对象可以存储键值对,并且只能存储对象,并且不能迭代
javascript
const weakMap = new WeakMap()  // 创建一个空的 WeakMap 对象

weakMap.set(obj, 'name')  // 设置键值对

weakMap.get(obj)  // 获取键值对

weakMap.has(obj)  // 判断键值对是否存在

weakMap.delete(obj)

JavaScript Set 对象

  • Set 对象可以存储唯一值,并且可以迭代
javascript
const set = new Set()  // 创建一个空的 Set 对象
set.add('name')  // 添加值
set.delete('name')  // 删除值
set.clear()  // 清空 Set 对象
for(let item of set) {  // 遍历 Set 对象
    console.log(item.name)
}

JavaScript WeakSet 对象

  • WeakSet 对象可以存储对象,并且不能迭代
javascript
const weakSet = new WeakSet()
weakSet.add(obj)
weakSet.has(obj)
weakSet.delete(obj)
weakSet.clear()

JavaScript Promise 对象

  • Promise 对象可以解决异步回调的问题,并且可以链式调用
javascript
const promise = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve('success')
        reject('error')
    })
})
promise.then(res => {
    console.log(res)
}, err => {
    console.log(err)
})

JavaScript Reflect 对象

  • Reflect 对象可以获取对象的属性和方法,并且可以链式调用
javascript
const reflect = new Reflect()
reflect.get(obj, 'name')  // 获取对象的属性和方法
reflect.set(obj, 'name', '张三')
reflect.deleteProperty(obj, 'name')  // 删除对象的属性和方法
reflect.has(obj, 'name')  // 判断对象的属性和方法是否存在
reflect.ownKeys(obj)  // 获取对象的属性和方法
reflect.apply(obj, 'name', [])  // 调用对象的方法
reflect.construct(obj, [])  // 构造对象

reflect.defineProperty(obj, 'name', {  // 定义对象的属性和方法的描述符
    value: '张三',
    writable: true,
    enumerable: true,
    configurable: true
})
reflect.getOwnPropertyDescriptor(obj, 'name')  // 获取对象的属性和方法的描述符
reflect.getPrototypeOf(obj)  // 获取对象的原型
reflect.isExtensible(obj)  // 判断对象的原型是否可扩展
reflect.preventExtensions(obj)  // 阻止对象的原型扩展
reflect.setPrototypeOf(obj, {})  // 设置对象的原型
reflect.getOwnPropertyDescriptors(obj)  // 获取对象的属性和方法的描述符

JavaScript Proxy 对象

  • Proxy 对象可以代理对象,并且可以拦截对象的操作
javascript
const proxy = new Proxy(obj, {
    get(target, key, receiver) {  // 获取对象的属性和方法
        return Reflect.get(target, key, receiver)
    },
    set(target, key, value, receiver) {  // 设置对象的属性和方法
        return Reflect.set(target, key, value, receiver)
    },
    deleteProperty(target, key) {  // 删除对象的属性和方法
        return Reflect.deleteProperty(target, key)
    },
    has(target, key) {  // 判断对象的属性和方法是否存在
        return Reflect.has(target, key)
    }
})

JavaScript Date 对象

JavaScript Date 对象的使用

  • Date 对象可以获取当前时间,也可以设置当前时间
javascript
const date1 = new Date()
console.log(date1)

const date2 = new Date('2021-01-01')
console.log(date2)

const date3 = new Date(2021, 0, 1)
console.log(date3)

console.log(date1.toISOString())  // 获取当前时间的 ISO 格式
console.log(date1.toLocaleString())  // 获取当前时间的本地格式
console.log(date1.toLocaleDateString())  // 获取当前时间的日期格式
console.log(date1.toLocaleTimeString())  // 获取当前时间的时间格式

console.log(date2.getDate())  // 获取当前时间的日期
console.log(date2.getDay())  // 获取当前时间的星期几
console.log(date2.getFullYear())  // 获取当前时间的年份
console.log(date2.getHours())  // 获取当前时间的小时
console.log(date2.getMilliseconds())  // 获取当前时间的毫秒
console.log(date2.getMinutes())  // 获取当前时间的分钟
console.log(date2.getMonth())  // 获取当前时间的月份
console.log(date2.getSeconds())  // 获取当前时间的秒
console.log(date2.getTime())  // 获取当前时间的时间戳

date2.setDate(1)  // 设置当前时间的日期
date2.setFullYear(2021)  // 设置当前时间的年份
date2.setHours(0)  // 设置当前时间的小时
date2.setMilliseconds(0)  // 设置当前时间的毫秒
date2.setMinutes(0)  // 设置当前时间的分钟
date2.setMonth(0)  // 设置当前时间的月份
date2.setSeconds(0)  // 设置当前时间的秒
date2.setTime(0)  // 设置当前时间的时间戳

JavaScript Math 对象

JavaScript Math 对象的使用

  • Math 对象是数学处理函数的
javascript
console.log(Math.abs(-1))  // 获取绝对值

console.log(Math.ceil(1.1))  // 向上取整
console.log(Math.floor(1.1))  // 向下取整
console.log(Math.max(1,2,3,4,5))  // 获取最大值
console.log(Math.min(1,2,3,4,5))  // 获取最小值
console.log(Math.random())  // 获取随机数 [0,1)
console.log(Math.round(1.1))  // 四舍五入
console.log(Math.sign(1))  // 获取符号
console.log(Math.sqrt(1))  // 获取平方根
console.log(Math.trunc(1.1))  // 获取整数部分
console.log(Math.pow(2, 3))  // 获取幂

console.log(Math.log(2))  // 获取对数
console.log(Math.log2(2))  // 获取对数
console.log(Math.log10(2))  // 获取对数
console.log(Math.sin(1))  // 获取正弦值
console.log(Math.cos(1))  // 获取余弦值
console.log(Math.tan(1))  // 获取正切值

JavaScript RegExp 对象

JavaScript RegExp 对象的使用

  • RegExp 对象是正则表达式处理的函数
javascript
const reg1 = /\d+/g  // 全局匹配数字
const reg2 = /\d+/  // 匹配数字
const reg3 = new RegExp('\d+', 'g')  // 创建正则表达式
console.log(reg1.test('123'))  // 测试匹配数字
console.log(reg2.test('123'))  // 测试匹配数字
console.log(reg3.test('123'))
console.log(reg1.exec('123'))  // 执行正则表达式

JavaScript object 对象

  • object 对象是 JavaScript 对象的
javascript
const obj1 = {
    name: 'John',
    age: 18,
}
console.log(obj1.name)
console.log(obj1['name'])
console.log(obj1.hasOwnProperty('name'))  // 判断对象中是否存在某个属性
console.log(Object.keys(obj1))  // 获取对象中键
console.log(Object.values(obj1))  // 获取对象中值
console.log(Object.entries(obj1))  // 获取对象中键值对
console.log(Object.assign({}, obj1))  // 合并对象
console.log(Object.getOwnPropertyDescriptor(obj1, 'name'))  // 获取对象中属性描述符
console.log(Object.defineProperty(obj1, 'name', {
    value: 'John',
    writable: false,
    enumerable: true,
    configurable: true,
    get() {
        return this.name
    },
    set(value) {
        this.name = value
    }
}))  // 定义对象中属性描述符  vue2 的响应式原理

class Person {
    private name: string
    private age: number
    constructor(name, age) {
        this.name = name
        this.age = age
    }
    say() {
        console.log(`${this.name} is ${this.age} years old`)
    }
    get name() {
        return this.name
    }
    set name(value) {
        this.name = value
    }
    get age() {
        return this.age
    }
    set age(value) {
        this.age = value
    }
}
class Student extends Person {
    private school: string
    constructor(name, age, school) {
        super(name, age)
        this.school = school
    }
    study() {}
    get school() {}
    set school(value) {}
}

JavaScript Event 对象

  • Event 对象是事件处理函数的
  • 事件处理函数的参数是 event 对象
javascript
document.addEventListener('click', (event) => {
    console.log(event.target)  // 获取事件触发的元素实例
    console.log(event.currentTarget)  // 获取添加事件的元素实例
    console.log(event.type)  // 获取事件类型
    console.log(event.timeStamp)  // 获取事件触发的时间戳
    console.log(event.clientX)  // 获取鼠标点击的位置
    console.log(event.pageX)  // 获取鼠标点击的位置
    console.log(event.screenX)  // 获取鼠标点击的位置
    console.log(event.ctrlKey)  // 获取是否按下了 Ctrl 键
    console.log(event.altKey)  // 获取是否按下了 Alt 键
    console.log(event.shiftKey)  // 获取是否按下了 Shift 键
})

JavaScript Event 鼠标事件

  • 鼠标事件是鼠标点击、移动、滚动等事件
javascript
document.addEventListener('mousemove', (event) => {})  // 鼠标移动事件


document.addEventListener('mouseup', (event) => {})  // 鼠标抬起事件

document.addEventListener('mousedown', (event) => {})  // 鼠标按下事件

document.addEventListener('mouseenter', (event) => {})  // 鼠标进入事件

document.addEventListener('mouseleave', (event) => {})  // 鼠标离开事件

JavaScript Event 键盘事件

  • 键盘事件是键盘按下、抬起等事件
javascript
document.addEventListener('keydown', (event) => {})  // 键盘按下事件

document.addEventListener('keyup', (event) => {})  // 键盘抬起事件

document.addEventListener('keypress', (event) => {})  // 键盘按下事件

document.addEventListener('contextmenu', (event) => {})  // 右键菜单事件

document.addEventListener('focus', (event) => {})  // 获取焦点事件

document.addEventListener('blur', (event) => {})  // 失去焦点事件

document.addEventListener('resize', (event) => {})  // 窗口大小改变事件

document.addEventListener('scroll', (event) => {})  // 滚动事件

document.addEventListener('load', (event) => {})  // 加载事件

document.addEventListener('unload', (event) => {})  // 卸载事件

document.addEventListener('beforeunload', (event) => {})  // 卸载事件

document.addEventListener('hashchange', (event) => {})  // 窗口地址改变事件

document.addEventListener('popstate', (event) => {})  // 窗口历史记录改变事件

document.addEventListener('DOMContentLoaded', (event) => {})  // 网页加载完成事件

JavaScript Event 窗口事件

  • 窗口事件是窗口大小改变、滚动、加载等事件
javascript
window.addEventListener('resize', (event) => {
    console.log(window.innerWidth)  // 获取窗口宽度
})  // 窗口大小改变事件

window.addEventListener('scroll', (event) => {
    console.log(window.scrollX)  // 获取滚动条的 X 轴位置
    console.log(window.scrollY)  // 获取滚动条的 Y 轴位置
})

JavaScript Event 拖拽事件

  • 拖拽事件是拖拽元素、拖拽结束等事件
javascript
document.addEventListener('dragstart', (event) => {
    console.log(event.dataTransfer.setData('text', '123'))  // 设置拖拽的数据
    console.log(event.dataTransfer.setData('text/plain', '123'))  // 设置拖拽的数据
    console.log(event.dataTransfer.setData('text/html', '123'))  // 设置拖拽的数据
    console.log(event.dataTransfer.setData('text/uri-list', '123'))  
    console.log(event.dataTransfer.setData('text/x-moz-url', '123'))
})  // 拖拽开始事件

JavaScript Event 触摸事件

  • 触摸事件是触摸屏幕、移动、抬起等事件
javascript
document.addEventListener('touchstart', (event) => {
    console.log(event.touches[0].clientX)  // 获取触摸点的 X 轴位置
})  // 触摸开始事件
document.addEventListener('touchmove', (event) => {
    console.log(event.touches[0].clientX)
})  // 触摸移动事件
document.addEventListener('touchend', (event) => {})  // 触摸结束事件
document.addEventListener('touchcancel', (event) => {})  // 触摸取消事件
document.addEventListener('gesturestart', (event) => {})  // 触摸缩放事件
document.addEventListener('gesturechange', (event) => {})  // 触摸缩放事件
document.addEventListener('gestureend', (event) => {})  // 触摸缩放事件

JavaScript document 对象

JavaScript document 获取元素实例

  • document 对象是整个网页的根节点,可以通过 document 对象获取网页中的元素实例
javascript
const div1 = document.getElementById('div')
const div2 = document.querySelector('#div')
const div3 = document.querySelectorAll('#div')
const div4 = document.getElementsByClassName('div')
const div5 = document.getElementsByTagName('div')
const div6 = document.getElementsByName('div')
const div7 = document.getElementsBySelector('div')
const div8 = document.getElementsByAttribute('div')

JavaScript document 获取元素内容

  • document 对象是整个网页的根节点,可以通过 document 对象获取网页中的元素内容
javascript
const div1 = document.querySelector('div').innerText  // 获取元素的文本内容
const div2 = document.querySelector('div').innerHTML  // 获取元素的 HTML 内容
const div3 = document.querySelector('div').textContent  // 获取元素的文本内容
const div4 = document.querySelector('div').outerHTML  // 获取元素的 HTML 内容
const div5 = document.querySelector('div').outerText  // 获取元素的文本内容

JavaScript document Hidden 属性

  • document 通过hidden 属性的设置控制元素的显示
javascript
document.querySelector('div').hidden = true  // 隐藏元素
document.querySelector('div').hidden = false  // 显示元素

JavaScript document style 属性

  • document 对象是整个网页的根节点,可以通过 document 对象获取网页中的元素样式
javascript
const div1 = document.querySelector('div').style.width  // 获取元素的宽度
const div2 = document.querySelector('div').style.height  // 获取元素的高度
const div3 = document.querySelector('div').style.backgroundColor  // 获取元素的背景颜色
const div4 = document.querySelector('div').style.color  // 获取元素的字体颜色
const div5 = document.querySelector('div').style.fontSize  // 获取元素的字体大小
const div6 = document.querySelector('div').style.fontWeight  // 获取元素的字体粗细
const div7 = document.querySelector('div').style.fontStyle  // 获取元素的字体样式
const div8 = document.querySelector('div').style.textAlign  // 获取元素的文本对齐方式

JavaScript document ClassName属性

  • 实现的就是获取我们的元素类名的
javascript
const div1 = document.querySelector('div')

div1.className = 'div'  // 设置元素的类名

JavaScript document ClassList属性

  • 实现的就是获取我们的元素类名列表的的
  • 内部的方法有: add remove contains toggle replace
javascript
const div1 = document.querySelector('div')

div1.classList.add('div')  // 添加元素的类名
div1.classList.remove('div')  // 移除元素的类名
div1.classList.contains('div')  // 判断元素中是否存在某个类名
div1.classList.toggle('div')  // 切换元素的类名

JavaScript document Attribute属性

  • 就是实现的是控制我们的元素本身具备的属性的获取吧
javascript
const div1 = document.querySelector('div')
console.log(div1.hasAttribute("class"))  // 判断元素中是否存在某个属性
console.log(div1.getAttribute("class"))  // 获取元素的某个属性
console.log(div1.setAttribute("class", "div"))  // 设置元素的某个属性
console.log(div1.removeAttribute("class"))  // 移除元素的某个属性

JavaScript document Property属性

  • 就是实现的是控制我们的元素本身具备的属性的获取吧
javascript
const div1 = document.querySelector('div')

console.log(div1.className, div1.id, div1.title, 
    div1.lang, div1.dir, div1.accessKey, 
    div1.tabIndex, div1.draggable, 
    div1.contentEditable, div1.spellcheck, 
    div1.autocapitalize, div1.autocorrect, 
    div1.autosave, div1.inputMode, 
    div1.isContentEditable)

JavaScript document Data-* 属性

  • 实现的就是获取我们的元素自定义属性的
javascript
const div1 = document.querySelector('div')

console.log(div1.dataset?.name, div1.dataset?.age)

JavaScript document 创建元素实例

  • 实现的就是创建我们的元素实例的
javascript
const divEl = document.createElement("div")

document.querySelector("#div").append(divEl)  // 尾添加元素实例
document.querySelector("#div").prepend(divEl) // 前添加元素实例
document.querySelector("#div").before(divEl)   // 前添加元素实例
document.querySelector("#div").after(divEl)  // 后添加元素实例
document.querySelector("#div").replaceWith(divEl)  // 替换元素实例

JavaScript document 删除元素实例

  • 实现的就是删除我们的元素实例的
javascript
document.querySelector("#div").remove()  // 删除元素本身实例
document.querySelector("#div").removeChild(divEl)  // 删除元素子节点实例
document.querySelector("#div").removeAttribute("class")  // 删除元素属性实例

JavaScript document window事件

  • 实现的就是控制我们的窗口事件的
javascript
window.onload = function () {
    console.log('页面加载完成')
}

window.onresize = function () {
    console.log('页面大小改变')
}

window.onscroll = function () {
    console.log('页面滚动')
}

window.onbeforeunload = function () {
    console.log('页面关闭前')
}

window.onunload = function () {
    console.log('页面关闭')
}

const div = document.querySelector('#div')
console.log(div.scrollHeight)  // 获取元素内容的高度
console.log(div.scrollWidth)  // 获取元素内容的宽度
console.log(div.scrollTop)  // 获取元素滚动的距离
console.log(div.scrollLeft)  // 获取元素滚动的距离
console.log(div.clientWidth)  // 获取元素可见宽度
console.log(div.clientHeight)  // 获取元素可见高度
console.log(div.offsetWidth)  // 获取元素宽度
console.log(div.offsetHeight)  // 获取元素高度
console.log(div.offsetTop)  // 获取元素距离顶部的距离
console.log(div.offsetLeft)  // 获取元素距离左边的距离
console.log(div.getBoundingClientRect())  // 获取元素位置

JavaScript bom 操作

  • bom 是浏览器对象模型,提供了一些操作浏览器的方法,比如:窗口大小、滚动条位置、浏览器信息、cookie、本地存储等。

JavaScript bom window对象

JavaScript bom location对象

  • 实现的就是控制我们的窗口地址的
javascript
window.location.href = 'https://www.baidu.com'  // 跳转到新的地址
window.location.replace('https://www.baidu.com')  // 跳转到新的地址
window.location.reload()  // 刷新页面
window.location.assign('https://www.baidu.com')  // 跳转到新的地址

console.log(window.location.href)  // 获取当前地址
console.log(window.location.protocol)  // 获取当前协议
console.log(window.location.host)  // 获取当前域名
console.log(window.location.hostname)  // 获取当前域名
console.log(window.location.pathname)  // 获取当前路径
console.log(window.location.search)  // 获取当前参数
console.log(window.location.hash)  // 获取当前锚点
console.log(window.location.origin)  // 获取当前域名

const urlSearchParams = new URLSearchParams(window.location.search)
for (const [key, value] of urlSearchParams) {  // 获取当前参数
    console.log(key, value)
}

JavaScript bom history对象

  • 实现的就是控制我们的窗口历史记录的
javascript
window.history.back()  // 后退
window.history.forward()  // 前进
window.history.go(-1)  // 后退
window.history.go(1)  // 前进
window.history.pushState({}, '', 'https://www.baidu.com')  // 添加历史记录
window.history.replaceState({}, '', 'https://www.baidu.com')  // 替换历史记录
window.history.state  // 获取当前历史记录

JavaScript bom navigator对象

  • 实现的就是控制我们的浏览器信息的
javascript
console.log(window.navigator.userAgent)  // 获取浏览器信息
console.log(window.navigator.platform)  // 获取浏览器平台
console.log(window.navigator.language)  // 获取浏览器语言
console.log(window.navigator.onLine)  // 获取浏览器是否在线
console.log(window.navigator.cookieEnabled)  // 获取浏览器是否允许cookie
console.log(window.navigator.appName)  // 获取浏览器名称
console.log(window.navigator.appVersion)  // 获取浏览器版本
console.log(window.navigator.appCodeName)  // 获取浏览器代码名称
console.log(window.navigator.product)  // 获取浏览器产品名称

JavaScript bom screen对象

  • 实现的就是控制我们的屏幕信息的
javascript
console.log(window.screen.width)  // 获取屏幕宽度
console.log(window.screen.height)  // 获取屏幕高度
console.log(window.screen.availWidth)  // 获取屏幕可用宽度
console.log(window.screen.availHeight)  // 获取屏幕可用高度
console.log(window.screen.colorDepth)  // 获取屏幕颜色深度
console.log(window.screen.pixelDepth)  // 获取屏幕像素深度
console.log(window.screen.orientation)  // 获取屏幕方向
console.log(window.screen.orientation.type)  // 获取屏幕方向类型
console.log(window.screen.orientation.angle)  // 获取屏幕方向角度
console.log(window.screen.orientation.lock('landscape'))  // 锁定屏幕方向
console.log(window.screen.orientation.unlock())  // 解锁屏幕方向
console.log(window.screen.orientation.onchange = function () {
    console.log('屏幕方向改变')
})

JavaScript bom cookie对象

  • 实现的就是控制我们的cookie信息的
javascript
document.cookie = 'name=zhangsan'
document.cookie = 'age=18'
document.cookie = 'sex=man'
document.cookie = 'name=zhangsan; expires=Thu, 18 Dec 2023 12:00:00 UTC; path=/'

JavaScript bom localStorage对象

  • 实现的就是控制我们的本地存储信息的
  • 持续化的存储,页面发生变化的时候任然存在的
javascript
localStorage.setItem('name', 'zhangsan')
localStorage.getItem('name')
localStorage.removeItem('name')
localStorage.clear()
for (let i = 0; i < localStorage.length; i++) {
    console.log(localStorage.key(i), localStorage.getItem(localStorage.key(i)))
}
localStorage.onstorage = function (e) {
    console.log(e.key, e.newValue)
}

JavaScript bom sessionStorage对象

  • 实现的就是控制我们的会话存储信息的
  • 临时的存储,页面发生变化的时候会丢失
  • 持续化的存储,页面发生变化的时候任然存在的
javascript
sessionStorage.setItem('name', 'zhangsan')
sessionStorage.getItem('name')
sessionStorage.removeItem('name')
sessionStorage.clear()
for (let i = 0; i < sessionStorage.length; i++) {
    console.log(sessionStorage.key(i), sessionStorage.getItem(sessionStorage.key(i)))
}
sessionStorage.onstorage = function (e) {
    console.log(e.key, e.newValue)
}

JavaScript bom scroll对象

  • 实现的就是控制我们的滚动条的位置的
javascript
window.scrollTo(0, 0)  // 滚动到顶部
window.scrollBy(0, 100)  // 滚动100px
window.scrollTo({
    top: 0,
    left: 0,
    behavior: 'smooth'  // 行为丝滑
})  // 滚动到顶部

window.onscroll = function () {
    console.log(window.scrollY)  // 获取滚动条位置
    if (window.scrollY > 100) {
        document.querySelector('.header').style.backgroundColor = 'red'
        document.querySelector('.header').style.color = 'white'
    }
}
window.onscroll = function () {
    console.log(window.scrollX)  // 获取滚动条位置
    if (window.scrollX > 100) {
        document.querySelector('.header').style.backgroundColor = 'red'
        document.querySelector('.header').style.color = 'white'
    }
}

const divEl = document.querySelector('.div')
console.log(divEl.scrollTop)  // 获取滚动条位置
console.log(divEl.scrollLeft)  // 获取滚动条位置
divEl.onscroll = function () {
    console.log(divEl.scrollTop)
    if (divEl.scrollTop > 100) {
        divEl.style.backgroundColor = 'red'
    }
}
console.log(divEl.scrollHeight)  // 获取滚动条高度
console.log(divEl.scrollWidth)  // 获取滚动条宽度
console.log(divEl.scrollTopMax)  // 获取滚动条最大高度
console.log(divEl.scrollLeftMax)  // 获取滚动条最大宽度
divEl.scrollTo({
    top: 0,
    left: 0,
    behavior: 'smooth'
})

JavaScript bom client对象

  • 实现的就是控制我们的客户端的信息的
javascript
console.log(window.innerWidth)  // 获取窗口宽度
console.log(window.innerHeight)  // 获取窗口高度
console.log(window.outerWidth)  // 获取窗口宽度
console.log(window.outerHeight)  // 获取窗口高度

const divEl = document.querySelector('.div')
console.log(divEl.clientWidth)  // 获取元素宽度
console.log(divEl.clientHeight)  // 获取元素高度

JavaScript bom offset对象

  • 实现的就是控制我们的元素偏移量的
  • 获取元素偏移量,就是获取元素距离文档的偏移量
javascript
console.log(divEl.offsetWidth)  // 获取元素宽度
console.log(divEl.offsetHeight)  // 获取元素高度
console.log(divEl.offsetLeft)  // 获取元素距离文档的偏移量
console.log(divEl.offsetTop)  // 获取元素距离文档的偏移量

JavaScript 网络编程

JavaScript Ajax的使用

  • 我们后面使用的网络请求库axios 对ajax 的封装
javascript
// 开始我们的 ajax 请求
const xhr = new XMLHttpRequest()  // 创建一个 xhr 对象

xhr.open('GET', 'http://localhost:3000/users')  // 打开请求

xhr.send()  // 发送请求

xhr.onreadystatechange = function () {
    if (xhr.readyState === 4 && xhr.status === 200) {
        console.log(xhr.response)
        console.log(JSON.parse(xhr.response))
        console.log(xhr.getResponseHeader('Content-Type'))
        console.log(xhr.getAllResponseHeaders())
        console.log(xhr.responseText)
        console.log(xhr.responseXML)
    }
    if (xhr.readyState === 4 && xhr.status === 404) {
        console.log('请求失败')
        console.log(xhr.response)
        console.log(xhr.responseText)
    }
    if (xhr.readyState === 4 && xhr.status === 500) {
        console.log('服务器错误')
    }
    if (xhr.readyState === 4 && xhr.status === 401) {
        console.log('权限不足')
    }
    if (xhr.readyState === 4 && xhr.status === 403) {
        console.log('禁止访问')
    }
    if (xhr.readyState === 4 && xhr.status === 400) {
        console.log('请求参数错误')
    }
}

xhr.onload = function () {  // 请求成功
    console.log(xhr.response)
    console.log(JSON.parse(xhr.response))
}

xhr.onerror = function () {  // 请求失败
    console.log(xhr.response)
}

xhr.onprogress = function (e) {  // 请求进度
    console.log("请求正在进行中")
}

xhr.onloadstart = function (e) {  // 请求开始
    
}

xhr.onloadend = function (e) {  // 请求结束
    
}
javascript
/**
 * 自定义封装网络请求
 * 实际上含有很多的好的封装的网络请求库,这里只是微微练习罢了
 * @param {string} url
 * @param {string} method
 * @param {Object} headers
 * @param {number} timeout
 * @param {Object} data
 * @param {"" | "arraybuffer" | "blob" | "document" | "json" | "text"} dataType
 * @param {boolean} is_async
 * @param {Function} success
 * @param {Function} failure
 */
function http_request_MyAjax({url, method = "GET", headers = {}, timeout = 3000, data = {},
  dataType = "json", is_async = true, success, failure} = {}) {

 // 返回我们的 Promise 来实现处理返回值结果
 return new Promise((resolve, reject) => {
     try {
        const xhr = new XMLHttpRequest()
        // 监听事件
        xhr.onload = function() {
            if (xhr.status >= 200 && xhr.status < 300) {
                success&& success(xhr.response)
                resolve({status: xhr.status, statusText: xhr.statusText, response: xhr.response})
            } else {
            failure&& failure({status: xhr.status, statusText: xhr.statusText}) 
                reject({status: xhr.status, statusText: xhr.statusText, response: xhr.response})
            }
        }
        // 配置信息
        xhr.responseType = dataType
        xhr.timeout = timeout
         // 监听网络超时
         xhr.ontimeout = function() {
        // 定时取消我们的网络请求
        const timer = setTimeout(function() {
            xhr.abort()
        }, 3000)
        reject({status: xhr.status, statusText: xhr.statusText, message: "请求超时 Timeout"})
        clearTimeout(timer)
     }

    // 区分 Get 和 Post 发送请求的方式
    if (method.toUpperCase() === "GET") {
    // for (const [key, value] of Object.entries(data)) {
    // url = url + "?" + key + "=" + value
    // }
    url += Object.keys(data).map(key =>
        `${encodeURIComponent(key)}=${encodeURIComponent(data[key])}`).join("&")
    xhr.open(method, url, is_async)
    xhr.send()
    } else {
        xhr.open(method, url, is_async)
        if (headers) {
            Object.entries(headers).forEach(([key, value]) =>
                xhr.setRequestHeader(key, `${value}`))
        }
        xhr.send(JSON.stringify(data))
    }
     } catch (e) {
        reject(e)
     }
    })
}

JavaScript fetch的使用

  • fetch 是一个全局对象,我们可以通过它来发送网络请求
  • fetch 支持我们的 promise 异步调用的
javascript
fetch('http://localhost:3000/users').then(res => {
    return res.json()
}, () => {
    console.log('请求失败')
})

fetch('http://localhost:3000/users', {
    method: 'POST',
    headers: {  // 请求头配置
        'Content-Type': 'application/json',  // json
        'Authorization': 'Bearer token',  // 认证配置
        'Accept': 'application/json',  // 接收数据格式指定
        'X-Requested-With': 'XMLHttpRequest',
        'X-CSRF-Token': 'token',
    },
    body: JSON.stringify({  // 请求体配置
        name: '张三',
        age: 18,
        sex: '男',
        password: '123456'
    }),
    params: {  // 查询参数配置
        id: 1,
        name: '张三',
    },
    proxy: 'http://localhost:3000',  // 代理配置
    mode: 'cors',  // 跨域配置
    credentials: 'include',  // 凭证配置
    redirect: 'follow',  // 重定向配置
    referrer: 'no-referrer',  // 引用配置
    referrerPolicy: 'no-referrer',  // 引用策略配置
    cache: 'no-cache',  // 缓存配置
    keepalive: true,  // 保活配置
    signal: AbortSignal.timeout(3000),  // 信号配置
}).then(res => {
    return [res.json(), res.text()]
})

Released under the MIT License.