微任务&宏任务

JS是单线程执行。所有要执行的任务都要排队。

所有的同步任务会在主线程上排队,等待执行。

异步任务:不会进入主线程,而是会进入任务队列。等到主线程上的任务执行完成之后,通知任务队列,执行异步任务。

在任务队列中,也存在着简单的任务和复杂的任务,因此,把任务队列中的复杂任务称为宏任务,把简单的任务称为微任务。

在主线程执行完同步任务后,先去执行任务队列的微任务,然后是宏任务

  console.log(1); //同步任务let p = new Promise((resolve) => {console.log(2); //promise内部也是同步任务resolve(3); //异步任务---微任务});p.then((res) => {{console.log(res);}});console.log(4); //同步任务//1 2 4 3

微任务有:

  1. promise的then方法
  2. async...await 后面的代码

宏任务有:

  1. setTimeout
  2. setinterval
  setTimeout(() => {console.log(0); //宏任务}, 100);console.log(1); //同步任务let p1 = new Promise((resolve) => {console.log(2); //promise内部也是同步任务resolve(3); //异步任务---微任务});p1.then((res) => {{console.log(res);}});console.log(4); //同步任务//输出:1 2 4 3 0
  function f2() {console.log(1);}console.log(2);async function f3() {console.log(3);await f2(); //f2为什么会在console.log(5)前执行?console.log(4);}f3();console.log(5);//输出2 3 1 5 4//await f2()会同步执行,实际上await后面的代码会放到任务队列中作为微任务去执行

class

ES5中定义类

  /*******************ES5中定义类,通过构造函数定义对象****************** */

  function Point(x, y) {

    this.x = x;

    this.y = y;

  }

  Point.prototype.toString = function () {

    return this.x;

  };

  var p = new Point(2, 4);

ES6中定义类

  class Animal { 

    constructor(name) {

      this.name = name;

    }

    speak() {

      console.log(this.name + ":hello world");

    }

  }

  let animal = new Animal("jack");

  animal.speak();

ES6 的class可以看作只是一个语法糖【type of Animal 是一个function】,它的绝大部分功能,ES5 都可以做到。

constructor是类中默认的方法,虽然没有在Point中显式定义constructor。constructor存在于Point类的原型对象中。

class只能通过new运算符进行构造 

  class Point {}let p2 = Point();//Uncaught TypeError: Class constructor Point cannot be invoked without 'new'

class继承

  class Point {constructor(x, y) {this.x = x;this.y = y;}coordinate() {return [this.x, this.y];}}//extends&super配使用实现继承class CircleDot extends Point {//extends关键字实现继承constructor(x, y) {super(x, y); //关键字,代表父类的构造函数//super相当于:Point.prototype.constructor.apply(this);}}let dot = new CircleDot(10, 20);//当子类和父属性重名,子类属性将覆盖从父类继承来的属性//当子类和父方法重名,子类方法将覆盖从父类继承来的方法class Point {constructor(x, y) {this.x = x;this.y = y;}coordinate() {return [this.x, this.y];}}class CircleDot extends Point {constructor(x, y, z) {super(x, y);this.x = z;}coordinate() {console.log("CircleDot");super.coordinate(); //调用父类的方法}}let circle = new CircleDot(1, 2, 3);

类的多重继承

一个类可以继承多个父类叫多继承

class默认不直接支持多继承。extends只能从一个类继承。Object.assign(Animal.prototype, EatMixin, SleepMixin)

  //定义一个混合特性let EatMixin = {eat() {console.log("eat");},};let SleepMixin = {sleep() {console.log("sleep");},};class Animal {}Object.assign(Animal.prototype, EatMixin, SleepMixin);//混合特性let a = new Animal();a.eat();

ES6模块化

模块通常是指编程语言所提供的代码组织机制,利用此机制可将程序拆解为独立且通用的代码单元。所谓模块化主要是解决代码分割、作用域隔离、模块之间的依赖管理以及发布到生产环境时的自动化打包与处理等多个方面

简单的说:模块化就是将变量和函数 放入不同的文件中

ES6模块(module)

模块Module 一个模块,就是一个对其他模块暴露自己的属性或者方法的文件

导出Export,作为一个模块,它可以选择性地给其他模块暴露(提供)自己的属性和方法,供其他模块使用

针对默认的模块文件:module.js

//一个文件内可以进行多次导出

export const n1 =10;

export const n2 =20;

export const n3 =30;

在引用时,使用:import { n1, n2, n3 } from "./module";

为什么使用{}进行导入接收。默认一个模块文件,在导出时是一个对象

const id = 1;

const name = "jack";

const msg = "success";

function sum(n1, n2) {

  return n1 + n2;

}

//直接暴露,很清晰

export { id, name, msg, sum };

使用时:

import { id, name, msg, sum } from './module2'

导出时使用别名:export { id as _id, name as _name, msg as _msg, sum };

导入时使用别名:import { id, name, msg, sum as _sum } from './module2'

export default {

  x: "x",

  y: "y",

};

使用的时候:

import obj from './module3'

  1. 如果使用export {}或者export const a ,引入的时候,import {} from ''---需要加{}
  2. 如果使用export default {},import 不需要加{},直接使用obj进行接收

export default { x: "x", y: "y" };

export const a = 1;

export const b = 2;

引入时:

import obj, { a, b } from './module5'

Proxy

proxy 在目标对象的外层搭建了一层拦截,外界对目标对象的某些操作,必须通过这层拦截

var proxy = new Proxy(target, handler);

target:目标对象;

handler:具体拦截的行为

基本使用

  //目标对象let target = {id: 1,};let handler = {}; //行为也是一个对象let proxy = new Proxy(target, handler);console.log(proxy.id); //通过代理对象获取原对象的属性//具体的实现方式:handler有2个属性let handler = {get: function (target, property) {console.log("handler");return target[property];},}; //行为也是一个对象let proxy = new Proxy(target, handler);console.log(proxy.id); //通过代理对象获取原对象的属性  

handler 本身就是 ES6 所新设计的一个对象.它的作用就是用来 自定义代理对象的各种可代理操 作 。它本身一共有 13 中方法,每种方法都可以代理一种操作.其 13 种方法如下:

  1. get(target,property):拦截对象属性的读取
  2. set(target,prokey,value):拦截对象属性的设置
  3. has(target, propKey):拦截propKey in proxy的操作,返回一个布尔值
  4. deleteProperty(target, propKey):拦截delete proxy[propKey]的操作,返回一个布尔值
  5. ownKeys(target):拦截Object.getOwnPropertyNames(proxy)、Object.getOwnPropertySymbols(proxy)、 Object.keys(proxy)、for...in循环,返回一个数组。该方法返回目标对象所有自身的属性的属性名,而 Object.keys()的返回结果仅包括目标对象自身的可遍历属性
  6. getOwnPropertyDescriptor(target, propKey):拦截Object.getOwnPropertyDescriptor(proxy, propKey),返回属性的描述对象 
  7. defineProperty(target, propKey, propDesc):拦截Object.defineProperty(proxy, propKey, propDesc)、 Object.defineProperties(proxy, propDescs),返回一个布尔值
  8. preventExtensions(target):拦截Object.preventExtensions(proxy),返回一个布尔值
  9. getPrototypeOf(target):拦截Object.getPrototypeOf(proxy),返回一个对象。
  10. isExtensible(target):拦截Object.isExtensible(proxy),返回一个布尔值
  11. setPrototypeOf(target, proto):拦截Object.setPrototypeOf(proxy, proto),返回一个布尔值。如果目标对象是函数,那么还有两种 额外操作可以拦截。
  12. apply(target, object, args):拦截 Proxy 实例作为函数调用的操作,比如proxy(...args)、proxy.call(object, ...args)、 proxy.apply(...)
  13. construct(target, args):拦截 Proxy 实例作为构造函数调用的操作,比如new proxy(...args)。

Object.defineProperty()与Proxy

  /*********************Object.defineProperty()与Proxy的异同************************ */let obj = {};Object.defineProperty(obj, "arr", {get: function () {console.log("Get");return v;},set: function (value) {console.log("Set");v = value;},});obj.arr = []; //触发setobj.arr = [1, 2, 3]; //触发setobj.arr.push(10); //没有触发set,而是触发getobj.arr[3] = 4; //没有触发set,而是触发get//vue2通过Object.defineProperty实现双向绑定,//但是针对数组类型,通过push等操作数组的方法虽然能够改变数组的值,但是不能触发界面更新//vue2的解决办法是:this.$set()方法/********************Vue3***************** */let arr = [];let handler3 = {set: function (target, property, value) {console.log("set");target[property] = value;return true;},get: function (target, property) {console.log("Get");return target[property];},};let p2 = new Proxy(arr, handler3);p2.push(10); //触发了4次,包括2次get,2次set

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FreeSWITCH配置文件解析(10) 配置IP封禁(防暴力破解)

以下是针对FreeSWITCH配置IP封禁(防暴力破解)的完整方案,结合Fail2Ban与系统级防护策略:一、Fail2Ban核心配置(推荐方案)​​启用FreeSWITCH鉴权日志​​修改SIP Profile(conf/sip_profiles/int…

【React 入门系列】React 组件通讯与生命周期详解

🧩 第一章:组件通讯概述在 React 开发中,组件是封装的、独立的功能单元。为了实现组件间的数据共享与协作,需要通过组件通讯机制。组件通讯的意义: 让多个封闭的组件能够共享数据,实现协作功能。&#x1f4…

前端开发 Vue 状态优化

Vue 项目中的状态优化一般都会用Pinia替代Vuex,Pinia 是 Vue 生态系统中的一个轻量级状态管理库,作为 Vuex 的替代品,它提供了更简洁的 API 和更好的性能。模块化管理:使用 Pinia 时,建议将状态拆分为多个 store 模块&…

虚幻基础:创建角色——FPS

能帮到你的话,就给个赞吧 😘 文章目录创建角色设置模型添加摄像机添加位置:插槽弹簧臂:伸缩防止由碰撞导致摄像机穿模摄像机添加武器添加位置:插槽创建动画蓝图:主动获取角色数据并播放相应动画设置角色控制…

2025年入局苹果Vision Pro开发:从零到发布的完整路线图

苹果Vision Pro的发布标志着空间计算(Spatial Computing)进入主流市场。作为开发者,如何快速掌握visionOS开发?本文将为你提供详细的路线图、实践建议与资源指南,涵盖从窗口式应用到沉浸式3D应用的完整开发路径。 一、visionOS开发的核心目标与阶段划分 visionOS的开发可…

百度文心大模型ERNIE全面解析

百度文心大模型ERNIE概述 百度推出的文心大模型(ERNIE,Enhanced Representation through kNowledge IntEgration)系列是结合知识增强技术的预训练大模型,涵盖自然语言处理(NLP)、跨模态、行业应用等多个方向。其开源版本为开发者提供了可商用的大模型能力支持。 ERNIE的…

【SpringAI实战】提示词工程实现哄哄模拟器

一、前言 二、实现效果 三、代码实现 3.1 后端实现 3.2 前端实现 一、前言 Spring AI详解:【Spring AI详解】开启Java生态的智能应用开发新时代(附不同功能的Spring AI实战项目)-CSDN博客 二、实现效果 游戏规则很简单,就是说你的女友生气了&#x…

速通python加密之AES加密

AES加密 AES加密(Advanced Encryption Standard,高级加密标准)是目前全球公认的最安全、应用最广泛的对称加密算法之一,于2001年被美国国家标准与技术研究院(NIST)确定为替代DES的标准加密算法,…

Java 对象秒变 Map:字段自由伸缩的优雅实现

前言 在开发中,我们常常需要把对象转成 Map 格式,用于序列化、传输、展示,甚至硬塞给某些第三方框架吃进去再吐出来。乍一看很简单,字段多起来后就像打翻调色盘,维护起来一不小心就翻车。想优雅地搞定这事,必须有一套稳妥、可扩展的方案,才能写出让同事膜拜、领导点赞、…

激光雷达-相机标定工具:支持普通相机和鱼眼相机的交互式标定

激光雷达-相机标定工具:支持普通相机和鱼眼相机的交互式标定 前言 在自动驾驶、机器人导航等领域,激光雷达和相机的标定是一个基础而重要的问题。准确的标定结果直接影响后续的感知算法性能。本文将介绍一个开源的激光雷达-相机标定工具,支持…

linux shell从入门到精通(二)——变量操作

1.什么是变量变量在许多程序设计语言中都有定义,与变量相伴地有使用范围地定义。Linux Shell也不例外。变量,本质上就是一个键值对。例如:str“hello”就是将字符串值“hello”赋予键str。在str地使用范围内,我们都可以用str来引用…

[Linux入门] 初学者入门:Linux DNS 域名解析服务详解

目录 一、域名服务基础:从 “名字” 到 “地址” 的转换 1️⃣什么是域名? 2️⃣什么是 DNS? 3️⃣DNS 用 TCP 还是 UDP? 二、DNS 服务器:各司其职的 “导航站” 1️⃣根域名服务器 2️⃣顶级域名服务器 3️⃣权…

iview表单验证一直提示为空的几个原因?

1.Form上的rules是否配置正确; 2.Form-item的prop是否配置正确; 3.规则的名称和input的v-model是否对应; 4.验证的字段是否响应,新增字段使用this. $set. © 著作权归作者所有,转载或内容合作请联系作者 平台声明&#xff1…

SpringBoot3(若依框架)集成Mybatis-Plus和单元测试功能,以及问题解决

一、Mybatis-Plus集成 新增依赖到父级pom.xml,原先的mybatis依赖可以不动需要注意 mybatis-plus与mybatis版本之间的冲突,不要轻易改动依赖,不然分页也容易出现问题分类顶级pom.xml下面,如果没有引入还是出现报错,在co…

删除远程分支上非本分支的提交记录

要删除远程分支上非本分支的提交记录(即主分支的提交历史),需要使用 Git 的重写历史功能。以下是完整解决方案: 解决方案步骤: 创建干净的新分支(基于主分支最新提交) # 切换到主分支并更新 git…

Flask input 和datalist结合

<input list"categories" name"category" id"category" class"form-control" placeholder"任务分类" required> 这段代码是一个 HTML 输入控件&#xff0c;结合了 <input> 和 <datalist>&#xff0c;用来…

嵌入式分享#27:原来GT911有两个I2C地址(全志T527)

最近在调试全志T527的触摸功能时&#xff0c;发现GT911触摸芯片的I2C地址有时是0x5d&#xff0c;有时又识别成0x14&#xff0c;不知道大家有没有遇到过类似这个情况。虽然最后使用0x5d地址调通了触摸功能&#xff0c;但是一直还是很困惑&#xff0c;为什么会出现0x14和0x5d两个…

Linux运维新人自用笔记(Rsync远程传输备份,服务端、邮箱和客户端配置、脚本)

内容全为个人理解和自查资料梳理&#xff0c;欢迎各位大神指点&#xff01;每天学习较为零散。day24一、Rsync传输文件#安装rsync#-a递归同步&#xff08;包含子目录&#xff09;保留文件权限、所有者、组、时间戳等元数据 #​​-z传输时压缩数据 #​​-v显示详细同步过程 #​​…

以 “有机” 重构增长:云集从电商平台到健康生活社区的跃迁

当电商行业陷入流量争夺的红海&#xff0c;同质化运营模式难以突破增长瓶颈时&#xff0c;云集以从精选电商到有机生活平台的战略转型&#xff0c;开辟出差异化发展路径。其转型并非凭经验决断的孤例&#xff0c;而是建立在对市场趋势的精准研判、用户需求的深度解码&#xff0…

【2025最新版】midjourney小白零基础入门到精通教程!人工智能绘图+AI绘图+AI画图,一键出图教程 (持续更新)

前言 现在市面上相关的AI绘画工具非常多&#xff0c;有6pen.art、Stable Diffusion、DALL.E、Midjourney等。 而MJ就目前而言&#xff0c;它是一款强大的人工智能工具&#xff0c;旨在帮助设计师和创意人员完成各种设计任务。 非常适合我们图像工作者&#xff0c;从 UI 设计到…