当前位置: 首页 > article >正文

JavaScript 核心原理深度解析-不停留于表面的VUE等的使用!

一、解释

JavaScript 作为当今最流行的编程语言之一,广泛应用于 Web 开发、移动端开发、后端开发等多个领域。然而,许多开发者在使用 JavaScript 时,往往只关注其表面的语法和 API,而对其底层原理和核心机制了解甚少。深入理解 JavaScript 的底层原理,对于编写高效、健壮的代码,解决实际开发中的问题具有重要意义。本文将从 JavaScript 引擎、数据类型、内存管理、事件循环等方面,深入分析 JavaScript 的核心原理。

二、JavaScript 引擎

(一)引擎概述
JavaScript 引擎是执行 JavaScript 代码的核心组件,它负责将 JavaScript 代码转换为计算机可以执行的机器码,并执行这些机器码。不同的浏览器和运行环境(如 Node.js)使用不同的 JavaScript 引擎,常见的引擎有 V8(Chrome、Node.js)、SpiderMonkey(Firefox)、JavaScriptCore(Safari)等。
(二)V8 引擎工作原理
以 V8 引擎为例,其工作流程主要包括解析、编译和执行三个阶段。

  1. 解析阶段
    词法分析:将输入的 JavaScript 代码字符串分解成一个个的词法单元(Token),例如关键字、标识符、操作符等。词法分析器会逐个字符地扫描代码,根据预先定义的词法规则识别出这些 Token,并生成 Token 流。
    语法分析:根据词法分析生成的 Token 流,按照 JavaScript 的语法规则构建抽象语法树(Abstract Syntax Tree,AST)。语法分析器会检查代码的语法是否正确,如果存在语法错误,会抛出相应的错误信息。AST 是代码的一种结构化表示,它以树状结构描述了代码的语法结构,便于后续的编译和优化。
  2. 编译阶段
    字节码生成(可选):在早期的 V8 引擎中,直接将 AST 编译为机器码。但随着代码复杂度的增加,直接编译为机器码的效率较低,尤其是对于重复执行的代码。因此,现代 V8 引擎引入了字节码(Bytecode)作为中间表示。字节码是一种介于 AST 和机器码之间的中间代码,它具有平台无关性,体积更小,生成速度更快。解释器可以快速执行字节码,而编译器则可以根据字节码进一步优化生成高效的机器码。
    优化编译:V8 引擎使用 Just-In-Time(JIT)编译技术,在代码执行过程中,对热点代码(频繁执行的代码)进行优化编译。JIT 编译器会分析代码的执行路径,识别出可以优化的部分,如循环体、函数调用等,并将其编译为高效的机器码。同时,JIT 编译器还会进行类型推断和优化,例如根据变量的类型生成更高效的指令。
  3. 执行阶段
    执行上下文:在执行 JavaScript 代码时,引擎会创建执行上下文(Execution Context)。执行上下文是代码执行的环境,它包含了变量对象、作用域链、this 值等信息。每个函数调用都会创建一个新的执行上下文,形成执行上下文栈(Execution Context Stack)。
    变量提升:在 JavaScript 中,变量和函数的声明会被提升到其作用域的顶部。这意味着在变量声明之前就可以使用该变量,不过此时变量的值为 undefined。变量提升是由引擎在解析阶段完成的,它会将变量和函数的声明提前处理,以便在执行阶段能够正确访问。

三、数据类型与内存管理

(一)数据类型
JavaScript 是一种动态类型语言,其数据类型可以分为原始数据类型和引用数据类型。

  1. 原始数据类型
    原始数据类型包括 Undefined、Null、Boolean、Number、String 和 Symbol(ES6 新增)。原始数据类型的值是不可变的,它们直接存储在栈内存中,访问时直接操作其值。例如:
    let num = 10;
    let str = “hello”;
    let bool = true;

  2. 引用数据类型
    引用数据类型包括 Object、Array、Function、Date、RegExp 等。引用数据类型的值是对象,它们存储在堆内存中,而变量中存储的是对象在堆内存中的引用地址。当使用引用数据类型时,实际上是通过引用地址来访问堆内存中的对象。例如:
    let obj = { name: “张三”, age: 20 };
    let arr = [1, 2, 3];

(二)内存管理
JavaScript 具有自动内存管理机制,开发者无需手动分配和释放内存,但了解内存管理的原理对于优化内存使用和避免内存泄漏非常重要。

  1. 内存分配
    原始数据类型的内存分配:在声明原始数据类型变量时,引擎会根据数据类型的大小在栈内存中分配相应的空间,并将值存储在该空间中。
    引用数据类型的内存分配:在创建引用数据类型对象时,引擎会在堆内存中分配一块空间来存储对象的属性和方法,然后将该空间的引用地址存储在栈内存中的变量中。
  2. 垃圾回收
    垃圾回收(Garbage Collection,GC)是引擎自动回收不再使用的内存的过程。JavaScript 中常用的垃圾回收算法有标记 - 清除(Mark-Sweep)、标记 - 整理(Mark-Compact)和引用计数(Reference Counting)。
    标记 - 清除算法:这是最常用的垃圾回收算法。算法分为两个阶段:标记阶段和清除阶段。在标记阶段,引擎从根对象(如全局对象 window)开始,遍历所有可达的对象,标记这些对象为存活状态;在清除阶段,引擎遍历堆内存,将未标记的对象(即不可达的对象)的内存空间回收。
    标记 - 整理算法:标记 - 整理算法是对标记 - 清除算法的优化。在清除阶段,标记 - 清除算法会留下大量不连续的内存碎片,影响后续的内存分配效率。标记 - 整理算法在标记阶段之后,会将所有存活的对象移动到堆内存的一端,然后清除边界以外的内存,从而减少内存碎片。
    引用计数算法:引用计数算法通过跟踪对象的引用次数来判断对象是否可以回收。当对象的引用次数为 0 时,说明该对象不再被使用,引擎会回收其内存。然而,引用计数算法存在循环引用的问题,即两个对象相互引用,导致它们的引用次数永远不为 0,从而无法回收内存。因此,现代 JavaScript 引擎已经很少单独使用引用计数算法,而是结合其他算法来解决循环引用问题。
  3. 内存泄漏
    内存泄漏是指不再使用的内存没有被正确回收,导致内存占用不断增加,最终影响程序的性能甚至导致程序崩溃。常见的内存泄漏场景包括:
    全局变量未被释放:如果变量声明在全局作用域中,并且没有被显式地设置为 null 或 undefined,那么该变量会一直存在于内存中,直到程序结束。
    闭包引用外部变量:闭包可以访问外部函数的变量,如果闭包没有被正确释放,外部变量会一直存在于内存中。
    DOM 元素引用未被移除:如果在 JavaScript 中保存了对 DOM 元素的引用,而该 DOM 元素已经从页面中移除,但引用仍然存在,就会导致内存泄漏。
    事件监听未被移除:如果添加了事件监听函数,但没有在适当的时候移除,事件监听函数会一直存在于内存中,即使对应的元素已经被移除。

四、事件循环与异步编程

(一)单线程与异步
JavaScript 是单线程语言,同一时间只能执行一段代码。这意味着在执行同步代码时,如果遇到耗时操作(如网络请求、文件读取等),会阻塞后续代码的执行,导致页面卡顿或程序响应缓慢。为了解决这个问题,JavaScript 采用了异步编程模型,通过事件循环(Event Loop)来处理异步操作。
(二)事件循环机制
事件循环是 JavaScript 实现异步编程的核心机制,它负责协调同步任务和异步任务的执行顺序。事件循环的工作流程如下:

  1. 任务队列
    异步任务会被添加到任务队列(Task Queue)中,任务队列分为宏任务队列(Macro Task Queue)和微任务队列(Micro Task Queue)。常见的宏任务包括 setTimeout、setInterval、setImmediate(Node.js)、I/O 操作、UI 渲染等;常见的微任务包括 Promise.then ()、process.nextTick(Node.js)、MutationObserver 等。
  2. 事件循环步骤
    执行同步任务:首先执行主线程中的同步任务,这些任务按照代码的执行顺序依次执行。
    处理微任务:在同步任务执行完毕后,事件循环会立即处理微任务队列中的所有任务,直到微任务队列为空。
    执行宏任务:处理完微任务后,事件循环会从宏任务队列中取出一个宏任务执行,然后再次处理微任务队列,如此循环往复。
    需要注意的是,微任务的优先级高于宏任务,即每次事件循环在执行完同步任务后,会优先处理微任务队列中的任务,然后再处理宏任务队列中的任务。
    (三)异步编程模式
  3. 回调函数
    回调函数是最基本的异步编程模式,它通过将回调函数作为参数传递给异步操作函数,在异步操作完成后调用回调函数来处理结果。例如:
    setTimeout(function() {
    console.log(“定时器触发”);
    }, 1000);

然而,回调函数存在回调地狱(Callback Hell)的问题,即当多个异步操作嵌套时,代码会变得非常复杂,难以维护。
2. Promise
Promise 是 ES6 引入的一种异步编程解决方案,它通过将异步操作封装为一个 Promise 对象,提供了一种更优雅的方式来处理异步操作的结果。Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。可以通过 then () 方法来处理成功的情况,通过 catch () 方法来处理失败的情况。例如:
let promise = new Promise((resolve, reject) => {
// 异步操作
setTimeout(() => {
resolve(“异步操作成功”);
}, 1000);
});

promise.then((result) => {
console.log(result);
}).catch((error) => {
console.log(“异步操作失败:”, error);
});

Promise 解决了回调地狱的问题,使异步代码更加清晰易读。
3. async/await
async/await 是 ES2017 引入的异步编程语法糖,它基于 Promise,提供了一种更接近同步代码的写法来处理异步操作。async 函数返回一个 Promise 对象,await 关键字用于等待 Promise 对象的结果。例如:

async function fetchData() {let response = await fetch("https://api.example.com/data");let data = await response.json();return data;
}fetchData().then((data) => {console.log(data);
}).catch((error) => {console.log("获取数据失败:", error);
});

async/await 使异步代码看起来像同步代码一样简洁明了,大大提高了代码的可读性和可维护性。

五、作用域与闭包

(一)作用域
作用域是变量和函数可以被访问的区域,JavaScript 中的作用域分为全局作用域、函数作用域和块级作用域(ES6 新增)。

  1. 全局作用域
    全局作用域是最外层的作用域,在全局作用域中声明的变量和函数可以在整个程序中访问。
  2. 函数作用域
    函数作用域是由函数声明创建的作用域,在函数内部声明的变量和函数只能在函数内部访问,外部无法访问。
  3. 块级作用域
    块级作用域是由花括号 {} 包裹的代码块(如 if 语句、for 循环等)创建的作用域,使用 let 和 const 声明的变量具有块级作用域。例如:
    if (true) {
    let x = 10;
    const y = 20;
    }
    console.log(x); // 报错,x不在当前作用域中
    console.log(y); // 报错,y不在当前作用域中

(二)作用域链
当在一个作用域中访问变量时,引擎会先在当前作用域中查找该变量,如果找不到,则会向上级作用域依次查找,直到全局作用域。这种逐级查找变量的过程形成了作用域链(Scope Chain)。作用域链的长度会影响变量的访问速度,因此应尽量避免在深层嵌套的作用域中访问变量。
(三)闭包
闭包是指函数可以访问并操作其外部作用域中的变量的现象。闭包的形成需要满足两个条件:一是函数嵌套,二是内部函数引用了外部函数的变量。闭包的作用包括:
实现数据封装:通过闭包可以将变量封装在函数内部,只暴露必要的接口,实现数据的私有化。
保存变量状态:闭包可以保存外部函数变量的状态,即使外部函数已经执行完毕,内部函数仍然可以访问这些变量。例如:

function createCounter() {let count = 0;return function() {count++;console.log(count);};
}let counter = createCounter();
counter(); // 1
counter(); // 2
counter(); // 3

在上面的例子中,内部函数引用了外部函数的变量 count,形成了闭包。每次调用 counter () 函数时,都会增加 count 的值,并输出结果,从而保存了 count 的状态。

六、原型与继承

(一)原型
在 JavaScript 中,每个对象都有一个原型(Prototype),原型也是一个对象,它包含了可以被当前对象继承的属性和方法。对象通过__proto__属性(非标准,建议使用 Object.getPrototypeOf () 方法)来访问其原型,而原型对象通过 prototype 属性(仅函数对象有)来设置其实例的原型。

  1. 原型链
    当访问一个对象的属性或方法时,引擎会先在对象自身中查找,如果找不到,则会沿着原型链向上查找,直到 Object.prototype。如果在原型链中都找不到该属性或方法,则返回 undefined。原型链的结构决定了对象的继承关系,是 JavaScript 实现继承的重要机制。
    (二)继承
    JavaScript 通过原型链来实现继承,常见的继承方式包括原型继承、构造函数继承、组合继承等。
  2. 原型继承
    原型继承是将子类的原型设置为父类的实例,从而使子类可以继承父类的属性和方法。例如:
function Parent() {this.name = "Parent";
}Parent.prototype.sayName = function() {console.log(this.name);
};function Child() {this.age = 20;
}Child.prototype = new Parent();
Child.prototype.constructor = Child;let child = new Child();
child.sayName(); // "Parent"

然而,原型继承存在一些问题,例如父类的引用类型属性会被所有子类实例共享,子类在实例化时无法向父类构造函数传递参数等。
2. 组合继承
组合继承结合了原型继承和构造函数继承的优点,通过在子类构造函数中调用父类构造函数来继承父类的实例属性,通过设置子类原型为父类原型的实例来继承父类的原型方法。组合继承是比较常用的继承方式,它解决了原型继承中存在的问题。

七、注意

JavaScript 的底层原理和核心机制是其强大功能和广泛应用的基础。深入理解 JavaScript 引擎的工作原理、数据类型与内存管理、事件循环与异步编程、作用域与闭包、原型与继承等核心原理,能够帮助开发者更好地掌握 JavaScript 语言,写出高效、健壮的代码,解决实际开发中的各种问题。随着 JavaScript 语言的不断发展和更新,新的特性和机制不断涌现,开发者需要持续学习和深入研究,以跟上技术的步伐,充分发挥 JavaScript 的优势。

相关文章:

JavaScript 核心原理深度解析-不停留于表面的VUE等的使用!

一、解释 JavaScript 作为当今最流行的编程语言之一,广泛应用于 Web 开发、移动端开发、后端开发等多个领域。然而,许多开发者在使用 JavaScript 时,往往只关注其表面的语法和 API,而对其底层原理和核心机制了解甚少。深入理解 J…...

【计算机网络】网络层IP协议与子网划分详解:从主机通信到网络设计的底层逻辑

🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:计算机网络 🌹往期回顾🌹: 【计算机网络】传输层TCP协议——协议段格式、三次握手四次挥手、超时重传、滑动窗口、流量控制、 &…...

基于WSL搭建Ubnutu 20.04.6 LTS(二)-部署Docker环境

Docker是一组平台即服务(PaaS)的产品。它基于操作系统层级的虚拟化技术,将软件与其依赖项打包为容器。托管容器的软件称为Docker引擎。Docker能够帮助开发者在轻量级容器中自动部署应用程序,并使得不同容器中的应用程序彼此隔离&a…...

【图像处理入门】6. 频域图像处理:傅里叶变换与滤波的奥秘

摘要 频域图像处理通过傅里叶变换将图像从空间域转换到频率域,为图像增强、去噪、压缩等任务提供全新视角。本文将深入解析傅里叶变换原理,介绍低通、高通滤波的实现方式,结合OpenCV和Python代码展示频域滤波在去除噪声、增强边缘中的应用,帮助读者掌握图像频域处理的核心…...

基于开源AI智能名片链动2+1模式S2B2C商城小程序的生态农庄留存运营策略研究

摘要:本文聚焦于生态农庄运营中的游客留存问题,以村长与乡亲们吸引游客进村为背景,深入探讨如何借助开源AI智能名片链动2 1模式S2B2C商城小程序实现游客的有效留存。通过分析该小程序在信息传递、服务整合、营销激励等方面的优势&#xff0c…...

Jenkins实现自动化部署Springboot项目到Docker容器(Jenkinsfile)

Jenkins实现自动化部署Springboot项目到Docker容器 引言:为什么需要自动化部署? 在软件开发中,频繁的手动部署既耗时又容易出错。通过 Docker + Jenkins + Git 的组合,您可以实现: ✅ 一键部署:代码推送后自动构建和部署🐳 环境一致性:Docker 确保开发、测试、生产环…...

【Linux】Git原理与使用

编程不仅是解决问题的艺术,更是对复杂性进行优雅管理的哲学。 前言 这是我自己学习Linux系统编程的第三篇笔记。后期我会继续把Linux系统编程笔记开源至博客上。 上一期笔记是关于Vim文本编辑器知识: 【Linux】Vim文本编辑器-CSDN博客https://blog.csdn…...

Cursor 工具项目构建指南: Python 3.8 环境下的 Prompt Rules 约束

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 Cursor 工具项目构建指南: Python 3.8 环境下的 Prompt Rules 约束前言项目简介技术栈…...

A*算法实现原理以及实现步骤(C++)

算法原理: A*算法是一种启发式搜索算法,用于在图中寻找最短路径。它结合了Dijkstra算法的确保最短路径的优点和贪心最佳优先搜索的高效性。其核心在于使用一个评估函数: f(n) g(n) h(n) 其中: - g(n) 表示从起点到节点n的实际代…...

Devops自动化运维---py基础篇一

python基础篇 1、基本数据类型 2、算术运算符 3、变量 变量:编程语言中能储存结果或能表示值的抽象概念 用途:用一段数据赋予一个简短、易于记忆的名字,方便重复使用3.1 格式转化变量 操作符号描述%s字符串%d整数%f浮点数 实例&#xff1…...

平安养老险蚌埠中心支公司开展金融宣教活动

近日,平安养老保险股份有限公司(以下简称“平安养老险”)蚌埠中心支公司,走进某合作企业开展金融教育宣传活动。 活动现场,平安养老险蚌埠中心支公司工作人员通过发放宣传手册和小礼品等方式,向企业员工普…...

游戏设计模式 - 子类沙箱

核心思想 子类沙箱模式(Subclass Sandbox)通过将核心逻辑封装在基类中,为子类提供安全的"沙箱"环境。子类通过组合或重写基类提供的预定义操作来实现行为,而非直接操作底层系统。 这种模式在游戏开发中常用于实现角色…...

java-springboot文件上传校验之只允许上传excel文件,且检查不能是脚本或者有害文件或可行性文件

四重验证机制: 文件扩展名检查(.xlsx/.xls)MIME类型检查文件魔数验证(真实文件类型)可执行文件特征检测 防御措施: 使用try-with-resources确保流关闭限制文件大小防止DoS攻击使用Apache POI的FileMagic进…...

openvino如何在c++中调用pytorch训练的模型

步骤1:将PyTorch模型转换为ONNX格式 转换代码示例(Python) import torch import torchvision1. 加载训练好的PyTorch模型 model torchvision.models.resnet18(pretrainedTrue) model.eval() # 设置为评估模式2. 创建虚拟输入&#xff08…...

Redisson简明教程—你家的锁芯该换了

1.简介 各位攻城狮们,你还在使用原生命令来上锁么?看来你还是不够懒,饺子都给你包好了,你非要吃大饼配炒韭菜,快点改善一下“伙食”吧,写代码也要来点幸福感。今天咱们就来聊聊Redisson提供的各种锁&#…...

48V带极性反接保护-差共模浪涌防护方案

在工业自动化(电动机驱动 / 工业机器人)、交通基础设施(充电桩 / 车载电子)、安防系统(监控摄像头 / 门禁)、储能设备(BMS / 离网控制器)等领域,DC48V 电源因安全特低电压…...

Python----目标检测(使用YOLO 模型进行线程安全推理和流媒体源)

一、线程安全推理 在多线程环境中运行YOLO 模型需要仔细考虑,以确保线程安全。Pythons threading 模块允许您同时运行多个线程,但在这些线程中使用YOLO 模型时,需要注意一些重要的安全问题。本页将指导您创建线程安全的YOLO 模型推理。 1.1、…...

jvm学习第1day jvm简介,栈溢出、堆溢出

jvm学习第1day jvm简介,栈溢出、堆溢出 jvm简介栈线程安全栈溢出线程运行诊断堆堆溢出 方法区方法区内存溢出常量池和运行时常量池 jvm简介 jvm 是编译后的字节码文件运行的环境, 因此各个平台有了jvm可以运行java.class文件,这是Java跨平台…...

用广告维持的免费 AI 图像生成工具(个人项目分享)

用广告维持的免费 AI 图像生成工具(个人项目分享) 免费 AI 图像生成工具网址:https://aiart.gcc.ac.cn/ 最近做了一个 AI 图像生成器,主要目标是“尽量简单”: 打开网页就能用不用注册、不用登录免费,不…...

分析Web3下数据保护的创新模式

在这个信息爆炸的时代,我们正站在 Web3 的门槛上,迎接一个以去中心化、用户主权和数据隐私为核心的新时代。Web3 不仅仅是技术的迭代,它更是一场关于数据权利和责任的结构性变革。本文将探讨 Web3 下数据保护的创新模式,以期为用户…...

​减少交通拥堵、提高效率、改善交通安全的智慧交通开源了。

智慧交通视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上…...

协议融合驱动效能跃升:Modbus转Ethernet IP的挤出吹塑机应用

在现代工业自动化领域,Modbus作为一种串行通信协议,其稳定性和简单性被广泛应用于各种工控设备中。但随着技术的进步,对于更高速、更远传输距离的需求日益增长,这就需要将Modbus协议通过以太网进行传输,即实现Modbus T…...

Hive的TextFile格式优化方法

Hive的TextFile格式是一种简单的行式存储格式,数据以文本行形式存储,每行包含多个字段,字段间通过分隔符(如逗号、制表符)分隔。尽管TextFile在性能上不如ORC、Parquet等列式存储格式,但在特定场景下仍有其优势。以下是TextFile格式的特点、优势、使用场景及优化方法: …...

bug 记录 - 使用 el-dialog 的 before-close 的坑

需求说明 弹窗中内嵌一个 form 表单 原始代码 <script setup lang"ts"> import { reactive, ref } from "vue" import type { FormRules } from element-plus const ruleFormRef ref() interface RuleForm {name: stringregion: number | null } …...

Next.js 中间件鉴权绕过漏洞 CVE-2025-29927

前言:CVE-2025-29927 是一个影响 Next.js 的严重漏洞&#xff0c;源于开发者信任了客户端请求中携带的 X-Middleware-Rewrite 头部字段。攻击者可以手动构造该头部&#xff0c;实现绕过中间件逻辑&#xff0c;访问本应受保护的资源或 API。 影响版本&#xff1a;Next.js < …...

基于YOLO-NAS-Pose的无人机象群姿态估计:群体行为分析的突破

【导读】 应对气候变化对非洲象的生存威胁&#xff0c;本研究创新采用无人机航拍结合AI姿态分析技术&#xff0c;突破传统观测局限。团队在肯尼亚桑布鲁保护区对比测试DeepLabCut与YOLO-NAS-Pose两种模型&#xff0c;首次将后者引入野生动物研究。通过检测象群头部、脊柱等关键…...

8天Python从入门到精通【itheima】-71~72(数据容器“序列”+案例练习)

目录 71节-数据容器“序列”的切片 1.学习目标 2.什么是序列 3.序列的常用操作——切片 4.小节总结 72节——案例练习&#xff1a;序列的切片实践 1.案例需求 2.代码实战 好了&#xff0c;又一篇博客和代码写完了&#xff0c;励志一下吧&#xff0c;下一小节等等继续&a…...

中达瑞和SHIS高光谱相机在黑色水彩笔墨迹鉴定中的应用

在文件检验与物证溯源领域&#xff0c;对书写材料&#xff08;如墨水&#xff09;进行快速、准确、无损的鉴别至关重要。由陈维娜等人撰写的《高光谱技术结合化学计量法鉴别黑色水彩笔墨迹》&#xff08;发表于《光谱学与光谱分析》2023年第7期&#xff09;利用中达瑞和SHIS凝采…...

dvwa10——XSS(DOM)

XSS攻击&#xff1a; DOM型XSS 只在浏览器前端攻击触发&#xff1a;修改url片段代码不存储 反射型XSS 经过服务器攻击触发&#xff1a;可能通过提交恶意表单&#xff0c;连接触发代码不存储 存储型XSS 经由服务器攻击触发&#xff1a;可能通过提交恶意表单&#xff0c;连…...

dvwa14——JavaScript

LOW 先按提示尝试输入success&#xff0c;提交失败 那用bp抓包一下 &#xff0c;抓到这些&#xff0c;发现有token验证&#xff0c;说明改对token才能过 返回页面f12看一下源码&#xff0c;发现value后面的值像密码&#xff0c;于是试一下md5和rot13的解密 ROT13加密/解密 - …...