计算机基础2月19日 20:21
XML 实体详解:4 种类型与 XXE 攻击防护XML 文档里有些内容会反复出现——公司名、版权声明、版本号,每次手写既麻烦又容易改漏。XML 实体就是解决这个问题的:定义一次,到处引用。但实体的能力不止于此,外部实体还能引入其他文件的内容,而这个特性恰恰成了 XXE 攻击的入口。
## 实体是什么
实体(Entity)本质是一个"文本替身"——你在 DTD 里声明它代表什么,文档里用 `&实体名;` 引用它,解析器会自动替换成实际内容。
```xml
<!DOCTYPE config [
<!ENTITY app "订单系统">
<!ENTITY ver "2.3.1">
]>
<config>
<na...计算机基础2月19日 20:20
XML 文档格式良好和有效有什么区别?格式良好是 XML 的语法底线——标签必须闭合、正确嵌套、单一根元素、属性值加引号、特殊字符转义。解析器碰到不格式良好的文档直接报错,根本不会继续处理。
有效是在格式良好的基础上,再对照 DTD 或 XML Schema 检查语义约束——元素顺序对不对、必填字段有没有缺、数据类型匹不匹配。一个文档可以格式良好但无效(语法没问题但违反了 Schema 约束),但有效的一定格式良好。
核心区别:格式良好只管"能不能解析",有效还要管"符不符合业务规则"。前者是 XML 规范的硬性要求,后者取决于你定义的 Schema。
## 追问
### DTD 和 XML Schema 有什么区别...计算机基础2月19日 20:15
XML 解析中 DOM 和 SAX 有什么区别?DOM 把整个 XML 一次性加载到内存建树,SAX 逐行读、遇到标签就触发回调。所以 DOM 能随机访问、能改,但吃内存;SAX 省内存、速度快,但只能顺序读、不能改。面试里一般答到"一个树一个事件驱动"就算到位,但追问肯定会问更细。
## 追问
### DOM 和 SAX 的内存差距到底有多大?
解析一个 100MB 的 XML,DOM 可能吃掉 300-500MB 内存(树节点的对象开销远大于原始文本),SAX 基本只占几 KB 的缓冲区。大文件用 DOM 直接 OOM 是真实生产事故,不是理论风险。
### StAX 和 SAX 有什么区别?为什么有了 SAX 还要 St...计算机基础2月19日 20:20
XML 属性和子元素有什么区别?什么时候该用哪个?XML 属性适合放元数据——ID、类型、状态这类简单的键值对;子元素适合放实际数据和可能变复杂的内容。属性的硬限制是:只能存纯文本、同一元素内不能重复、不能嵌套子结构。所以只要信息有可能扩展、可能多值、可能变复杂,就应该用子元素。
一个实用的判断方法:如果你犹豫"这个该放属性还是子元素",大概率该用子元素。属性只在你非常确定它永远是一个简单原子值时才用。W3C 和 Google XML Style Guide 的建议一致:元数据用属性,数据本身用子元素。
## 追问
### 属性和子元素的核心区别是什么?
属性是开始标签上的 `name="value"` 对,值只能是纯文本,同名...前端2023年6月10日 00:51
什么是事件代理?原理、优缺点和应用场景是什么?事件代理(事件委托)是利用事件冒泡机制,将子元素的事件监听器统一绑定到父元素上的一种模式。面试中常从原理、优缺点、边界问题、实战场景四个层面考察。
## 核心原理
DOM 事件流经历三个阶段:捕获阶段(从 window 向下传播到目标元素)→ 目标阶段(事件到达目标元素)→ 冒泡阶段(从目标元素向上传播回 window)。事件代理利用的就是冒泡阶段——子元素触发事件后,事件沿 DOM 树逐层向上传播,因此在父元素上可以统一捕获并处理。
```javascript
// 传统方式:每个子元素各自绑定,N 个元素需要 N 个监听器
document.querySelectorAll('...前端2023年6月10日 01:01
some、every、find、filter、map、forEach 有什么区别?这 6 个方法是 JavaScript 数组最常用的迭代方法,面试几乎必考。核心区别在于**返回值类型**和**是否短路**,按返回值分三类记忆最清晰。
## 一、遍历类(无返回值)
### forEach
纯遍历,对每个元素执行回调,返回值永远是 `undefined`。
- **不能中断**:`return` 只跳过当前回调,`break` 语法不支持,想中途退出只能用 `try/catch` 抛异常(不推荐)
- **不支持异步**:回调里写 `async/await` 不会等待 Promise,因为 `forEach` 不关心返回值
```javascript
const...前端2023年6月10日 01:01
ES5 和 ES6 有什么区别?ES6(ES2015)是 JavaScript 历史上最大的一次版本更新,面试中这道题考查的是你对 JS 语言演进的理解深度。回答的关键不是罗列特性,而是讲清楚**每个变化解决了什么问题**。
## 变量声明:从 var 到 let/const
ES5 只有 `var`,存在两大问题:
```js
// 问题1:变量提升
console.log(a); // undefined(不会报错,但容易出 bug)
var a = 1;
// 问题2:无块级作用域
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i...前端2023年6月10日 01:02
ES6 中的 Map 和原生的 Object 有什么区别?Map 和 Object 都能存键值对,但 Map 是专门为"字典"场景设计的,解决了 Object 做字典时的几个硬伤。
**键的类型**:Object 的 key 只能是字符串或 Symbol,数字 1 和字符串 "1" 是同一个 key。Map 的 key 可以是任意类型——对象、函数、NaN 都行,用 SameValueZero 算法比较(NaN 等于 NaN)。
**原型链污染**:Object 有原型链,`obj.__proto__`、`obj.toString` 这类属性名会冲突。`Object.create(null)` 能规避,但写法不直觉。Map 天然没有这个问题...前端2023年11月19日 18:23
前端模块规范有哪些?模块如何异步加载?JavaScript 模块化经历了从全局变量污染到标准化模块系统的漫长演进,不同规范解决了不同阶段的问题。
## IIFE:最早的模块化尝试
在规范出现之前,开发者用立即执行函数表达式创建独立作用域:
```javascript
var MyModule = (function() {
var privateVar = 'hidden';
function privateMethod() { return privateVar; }
return {
publicMethod: function() { return privateMethod(); }
}...前端2023年11月19日 17:49
React 组件抽离公共逻辑代码有哪些方式?React 逻辑复用经历了三代方案的演进:Mixin → HOC / Render Props → Hooks。Mixin 已随 Class 组件淘汰,当前面试重点在后面三种。
## HOC(高阶组件)
函数接受一个组件,返回增强后的新组件:
```jsx
function withAuth(WrappedComponent) {
return function AuthComponent(props) {
const isAuthenticated = checkAuth();
return isAuthenticated
? <WrappedCo...