夜猫子的知识栈 夜猫子的知识栈
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《Web Api》
    • 《ES6教程》
    • 《Vue》
    • 《React》
    • 《TypeScript》
    • 《Git》
    • 《Uniapp》
    • 小程序笔记
    • 《Electron》
    • JS设计模式总结
  • 《前端架构》

    • 《微前端》
    • 《权限控制》
    • monorepo
  • 全栈项目

    • 任务管理日历
    • 无代码平台
    • 图书管理系统
  • HTML
  • CSS
  • Nodejs
  • Midway
  • Nest
  • MySql
  • 其他
  • 技术文档
  • GitHub技巧
  • 博客搭建
  • Ajax
  • Vite
  • Vitest
  • Nuxt
  • UI库文章
  • Docker
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

夜猫子

前端练习生
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《Web Api》
    • 《ES6教程》
    • 《Vue》
    • 《React》
    • 《TypeScript》
    • 《Git》
    • 《Uniapp》
    • 小程序笔记
    • 《Electron》
    • JS设计模式总结
  • 《前端架构》

    • 《微前端》
    • 《权限控制》
    • monorepo
  • 全栈项目

    • 任务管理日历
    • 无代码平台
    • 图书管理系统
  • HTML
  • CSS
  • Nodejs
  • Midway
  • Nest
  • MySql
  • 其他
  • 技术文档
  • GitHub技巧
  • 博客搭建
  • Ajax
  • Vite
  • Vitest
  • Nuxt
  • UI库文章
  • Docker
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • javascript基础
  • javascript中的对象
  • 面向对象
  • 函数中的this
  • 异步
  • 浏览器
  • javascript机制
  • 设计模式
  • 快速入门js
    • ES6
      • 解构赋值
      • 模块的导入导出
      • 导出
      • 引入
      • 模板字符串
      • 箭头函数
      • Promise
      • 一个基础的 Promise:
      • .then
      • .catch
      • .finally
      • 处理多个 Promise
      • 可迭代的异步任务
    • JS中的常见问题
      • 浮点数溢出
      • JS 中的假值
      • 双等与全等
      • 处理异步编程的异常
    • 前端常用的调试手段
    • 利用浏览器缓存数据
      • localStorage
      • sessionStorage
    • JS 中的常用的循环
      • for循环(遍历对象非常好用)
      • 函数方法循环
      • forEach
      • map
  • 《JavaScript教程》笔记
夜猫子
2024-04-17
目录

快速入门js

# 快速入门JS

# ES6

# 解构赋值

// 数组解构
let [a, b, c] = [1, 2, 3];
console.log(a, b, c)

// 对象解构
let {e, f, g:newg} = {e:1,f:2,g:3};
console.log(e, f, g,newg)

// 函数参数的解构
function move({x = 0, y} = {}) {
  return [x, y];
}
console.log(move())
console.log(move({x:1,y:2}))
console.log(move({y:2}))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

解构与拓展运算符

let {e, ...z} = {e:1,f:2,g:3};
console.log(e, z)
1
2

合并数据

const obj1={a:1,b:2,c:3}
const obj2={a:2,d:4,c:5}
const newobj={...obj1,...obj2}
console.log(newobj)
1
2
3
4

# 模块的导入导出

如何在一个文件中使用另一个文件中定义的方法或变量?

# 导出

文件 util.js:

const data={a:1,b:2}
function fun1(){
	console.log('fun1')
}
// 单独导出
export {
	data,fun1
}
// 默认导出
export default fun1
1
2
3
4
5
6
7
8
9
10

# 引入

文件 main.js:

// 单独引入
import {data,fun1} from './util.js'
// 默认引入
import fun1 from './util.js'

// 就可以在这个文件中使用上面引入的方法、数据了
fun1()
console.log(data)
1
2
3
4
5
6
7
8

# 模板字符串

当一个字符串是由多个变量组合而成的,我们可以使用模板字符创进行拼接

const name = 'jack';
const age = '23'
const str=`${name} - ${age}`
console.log(str)
1
2
3
4

# 箭头函数

函数的两种定义方法:

1.函数声明

function fun1(){
    console.log('fun1')
}
1
2
3

2.箭头函数

const fun2=()=>{
    cosnole.log('fun2')
}
1
2
3

注意

函数声明的函数具有完整的函数作用域,

  • 作为对象的方法调用。函数作用域为调用对象。
  • 作为普通函数调用。函数作用域为Windows。

箭头函数声明的作用域来自其上一级作用域(也就是比函数声明作用域高一层)

主要体现在 this 的使用上,下面 fun1 的作用域为对象 obj1,而 fun2 是箭头函数,那么其作用域为对象 obj1 的作用域(这里obj1是在Windows中定义的,那它的作用域就是Windows)。

举个🌰:

function fun1(){
    console.log(this,'fun1')
}
const fun2=()=>{
    console.log(this,'fun2')
}
const a=456
const obj1={
    a:123,
    fun1:fun1,
    fun2:fun2
}
obj1.fun1()
obj1.fun2()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# Promise

异步任务

通过 Promise,可以在 js 中实现异步任务

# 一个基础的 Promise:

通过 Promise 构造器,构造一个 Promise,

其参数是一个回调函数,

这个回调函数中的代码会被立即执行

而这个回调函数中带有两个参数(这两个参数都是函数,是Promise的执行重点)

let promise = new Promise(function(resolve, reject) {
  // executor(生产者代码),promise中的代码会被立即调用
});
1
2
3
  • 第一个参数 resolve

    执行 resolve 后表示 promise 执行成功,并返回 resolve 中的参数

    let promise = new Promise(function(resolve, reject) {
      resolve('123')
    });
    
    1
    2
    3
  • 第二个参数 reject

    执行 reject 后表示 promise 执行失败并抛出异常。其返回的异常为 reject 中参数

    let promise = new Promise(function(resolve, reject) {
      reject('失败了')
    });
    
    1
    2
    3

如何在 promise 执行成功或失败后进行操作?

# .then

在 promise 后跟一个 .then 方法,.then 中包裹的函数会在 promise 执行成功后执行,其参数为 promise 中 resolve 出来的数据

promise.then((value)=>{
 console.log(value)
})
1
2
3

# .catch

在 promise 后跟一个 .catch 方法,.catch 中包裹的函数会在 promise 执行失败后执行,其参数为 promise 中 reject 出来的异常

promise.catch((err)=>{
 console.log(err)
})

// 注意,也可以在 .then 后再跟 .catch,当 .then 未生效时会将 promise 的执行结果传递给下一个处理程序,也就是 .catch
promise.then((value)=>{
 	console.log(value)
}).catch((err)=>{
    console.log(err)
})
1
2
3
4
5
6
7
8
9
10

# .finally

在 promise 后跟一个 .finally 方法,.finally 中包裹的函数无论 promise 的处理结果如何最终都会执行

promise.then((value)=>{
 	console.log(value)
}).catch((err)=>{
    console.log(err)
}).finally(()=>{
    console.log('promise已经执行完了')
})
1
2
3
4
5
6
7

# 处理多个 Promise

有多个异步进程又该如何处理?

# Promise.all

等待所有 Promise **执行成功 **后会执行

Promise.all([
  new Promise(resolve => setTimeout(() => resolve(1), 3000)), // 1
  new Promise(resolve => setTimeout(() => resolve(2), 2000)), // 2
  new Promise(resolve => setTimeout(() => resolve(3), 1000))  // 3
]).then(alert); // 1,2,3 当上面这些 promise 准备好时:每个 promise 都贡献了数组中的一个元素
1
2
3
4
5
# Promise.allSettled

Promise.allSettled 与Promise类似,但其会等待所有的 promise 都被 执行,无论结果如何,

即使有 Promise 输出错误,也会获取到其他 Promise 的输出。

::: error

其他还有 .race,.any 方法,但一般用不到

:::

# 可迭代的异步任务

const request=(value)=>{
    return new Promise((resolve)=>{
        setTimeout(()=>{
            console.log(value)
            resolve(value)
        },1000)
    })
}

const fun1=()=>{
    request(1)
    console.log(2)
}
const fun2=async ()=>{
    await request(1)
    console.log(2)
}

fun1()
fun2()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

async 和 await 必须组合起来使用,且 async 会将声明的函数转化为异步任务(Promise)

# JS中的常见问题

# 浮点数溢出

js 中由于进制转化的精度问题进行数字计算时可能会导致浮点数溢出

0.1 + 0.2 // 0.30000000000000004
1

解决方法:

使用计算工具进行处理

如 js 的 toFixed() 函数,将数据进行四舍五入

(0.1 + 0.2).toFixed()
1

# JS 中的假值

进行条件判断时有六种值会被评定为假值

undefined、null、NaN、0、""、false

console.log(!undefined,!null,!NaN,!0,!"",!false)
1

# 双等与全等

双等

console.log(1 == 2) // false
console.log(1 == 1) // true
console.log(1 == '1') // true
console.log(null == undefined) // true
1
2
3
4

全等

console.log(1 === 2) // false
console.log(1 === 1) // true
console.log(1 === '1') // false
console.log(null === undefined) // false
1
2
3
4

双等和全等的最大区别是,双等只匹配值是否相等,而全等则会对类型和值都进行匹配

# 处理异步编程的异常

Promise:

const request=(value)=>{
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            reject(value)
        },1000)
    })
}
request('err').catch(err=>{
    console.log(err)
})

1
2
3
4
5
6
7
8
9
10
11

async/await:

const request=(value)=>{
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            reject(value)
        },1000)
    })
}

try{
 	await request('err')
}catch(err){
	console.log(err)
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 前端常用的调试手段

dubugger 断点和 console.log()

console.log(123)
debugger
console.log(456)
1
2
3

# 利用浏览器缓存数据

# localStorage

持久化的储存,内存大小一般为5MB,在不进行手动删除的情况下是一直存在的。

// 存储
localStorage.setItem("lastname", "Gates");
// 取回
localStorage.getItem("lastname");
1
2
3
4

储存的数据结构:字符串

其会将基本数据结构转化为字符串进行保存,无法保存函数,对象,数组等复杂结构。

因此,复杂的结构需要使用序列化,转化为 json字符串进行保存。

const obj={a:1,b:2}
// 存储
localStorage.setItem("obj", obj); // 储存对象,错误
// 取回
localStorage.getItem("obj");
1
2
3
4
5

储存复杂结构

储存时:使用 JSON.stringify() 转成 JSON 字符串

取回时:使用 JSON.parse 将 JSON 字符串解析回来

const obj={a:1,b:2}
// 存储
localStorage.setItem("obj", JSON.stringify(obj)); // 储存对象,错误
// 取回
JSON.parse(localStorage.getItem("obj"));
1
2
3
4
5

# sessionStorage

和 localStorage 用法一致,区别在于其为当前浏览器临时缓存,当你关闭浏览器时,sessionStorage 储存的数据会被清空

// 存储
sessionStorage.setItem("lastname", "Gates");
// 取回
sessionStorage.getItem("lastname");
1
2
3
4

# JS 中的常用的循环

# for循环(遍历对象非常好用)

for...in:遍历键名

const arr=[5,7,1,4]
for(let value in arr){
    console.log(value)
}
// 0,1,2,3
const obj={
    a:1,
    b:2,
    c:3
}
for(let value in obj){
    console.log(value)
}
// a,b,c
1
2
3
4
5
6
7
8
9
10
11
12
13
14

for...of:遍历键值

const arr=[5,7,1,4]
for(let value of arr){
    console.log(value)
}
// 5,7,1,4
const obj={
    a:1,
    b:2,
    c:3
}
for(let value of obj){
    console.log(value)
}
// 1,2,3
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 函数方法循环

# forEach

一般用于遍历数组,并处理相应的逻辑

const arr=[4,5,6]
const arr2=[]
arr.forEach((item,index)=>{
    arr2.push(item)
})
console.log(arr2)
1
2
3
4
5
6

# map

一般用于遍历数组,更改数组数据,其会返回一个更改后的新数组

const arr=[4,5,6]
const arr2=arr.map((item,index)=>{
    // 返回一个新的值
    const value=item+1
    return value
})
console.log(arr2)
1
2
3
4
5
6
7
编辑 (opens new window)
上次更新: 2024/4/18 10:11:43
设计模式

← 设计模式

最近更新
01
IoC 解决了什么痛点问题?
03-10
02
如何调试 Nest 项目
03-10
03
Provider注入对象
03-10
更多文章>
Copyright © 2019-2025 Study | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式