recursal/MDN huggingface dataset:
Chrome 浏览器
==========

Chrome 浏览器是 Google 开发的一个免费网络浏览器。它基于开源项目 Chromium。BrowserStack 中描述了它们之间的主要差异。Chrome 维护使用自己的渲染引擎 Blink 。注意：IOS 版本的 Chrome 使用了 IOS 平台的 WebView，而非 Blink。

参见
--

* Google Chrome 维基百科
### 对于使用者

如果你只想使用 Chrome，请点击下面的链接。

* 安卓版
* IOS 版
* 桌面版
### 对于开发者

如果你想尝试 Chrome 的最新功能，可以尝试使用预发布版本。Google 经常推送更新，并使得这些版本可以与稳定版并行运行。你可以在 Chrome Release Blog 参见相关内容。

* 安卓上的 Chrome 开发者版本
* 电脑上的 Chrome 金丝雀版本
Apple Safari
============

Safari是苹果公司开发的Web browser，与 Mac OS X 和 iOS 绑定。它基于开源的WebKit引擎。

参见
--

* 维基百科上的Safari
* Safari on apple.com
* The WebKit project
* WebKit nightly build
* Reporting a bug for Safari
伸缩性
===

`flex` 是一个 CSS 的`display` 属性中新添加一个值。随着`inline-flex`的使用，它将使它适用的元素成为一个flex container（伸缩容器），而这个元素的每个子元素将成为 flex item（伸缩项目）。伸缩项目将参与到 flex 布局中，所有由 CSS Flexible Box Layout Module（CSS 伸缩盒布局模型）定义的属性都能被它们使用。

`flex` 属性是`flex-grow`, `flex-shrink` 和 `flex-basis` 属性的简写。

此外，`<flex>` 可以作为弹性长度被引用在 CSS Grid（栅格）布局中。

参见
--

### 属性参考

* `align-content` 堆栈伸缩行
* `align-items` 侧轴上项目对齐方式
* `align-self` 侧轴上单个项目对齐方式
* `flex` 伸缩性
* `flex-basis` 伸缩 - 基准值
* `flex-direction` 伸缩流方向
* `flex-flow`伸缩流的方向与换行
* `flex-grow`伸缩 - 扩展基数
* `flex-shrink` 伸缩 - 收缩比率
* `flex-wrap` 伸缩 - 换行
* `justify-content` 主轴对齐
* `order` 伸缩 - 顺序
### 延伸阅读

* *CSS Flexible Box Layout Module Level 1 Specification（CSS 盒布局模型一级规范）*
* CSS Flexbox Guide（CSS 伸缩盒子指南）: *Basic Concepts of Flexbox（伸缩）*
* CSS Flexbox Guide（CSS 伸缩盒子指南）: *Relationship of flexbox to other layout methods（伸缩盒子与其他布局方法的关系）*
* CSS Flexbox Guide（CSS 伸缩盒子指南）: *Aligning items in a flex container（伸缩容器中项的对齐）*
* CSS Flexbox Guide（CSS 伸缩盒子指南）: *Ordering flex items（伸缩项的顺序）*
* CSS Flexbox Guide（CSS 伸缩盒子指南）: *Controlling Ratios of flex items along the main axis（控制主轴上伸缩项的比率）*
* CSS Flexbox Guide（CSS 伸缩盒子指南）: *Mastering wrapping of flex items（掌握如何包装伸缩项）*
* CSS Flexbox Guide（CSS 伸缩盒子指南）: *Typical use cases of flexbox（伸缩盒子的典型用例）*
CRUD
====

**CRUD** (创建：Create，读取：Read，更新：Update，删除：Delete) 是对于存储的信息可以进行操作的同义词。是一个对四种操作持久化信息的基本操作的助记符。CRUD 通常是指适用于存于数据库或数据存储器上的信息的操作，不过也可以应用在高层级的应用操作，例如通过在设置状态字段并标记删除的而并非移除数据的伪删除。

参见
--

* 在 Wikipedia 上的相关信息：CRUD
带宽
==

带宽是对于在给定时间内有多少的信息能够通过数据通道的一个度量。它经常以每秒钟多少 bits 的形式来表示，例如 Mb/s,Gb/s。

参见
--

* Bandwidth on Wikipedia
Jank
====

**Jank** 是指用户界面“卡顿”的表现，通常是在主线程上执行长任务、阻止渲染或在后台进程上消耗过多处理器能力所致。
回流
==

当浏览器必须重新处理和绘制部分或全部页面时，回流就会发生，例如当一个交互式站点更新后。

参见
--

* Google 关于“最小化浏览器回流”的文章
值
=

在数据或对象包装器 (en-US)的概念下，值是对象包装器包含的原始值。在变量或属性的概念下，值可以是原始类型或对象引用 (en-US)。

在 CSS 属性值的概念下，存在指定值、计算值和实际值，应用于每个元素和伪元素的每个 CSS 属性的最终值是一个四步计算的结果：值由定义决定（指定值），然后解析成一个用于继承的值（计算值），然后在必要时转换为绝对的值（应用值），最终根据本地环境的限制进行转化（实际值）。

关于 CSS 的数据类型，详见 CSS 值和单位。

参见
--

* 维基百科上的原始值包装类词条
ICE
===

**ICE** (*交互式连接建立*) 是一个被WebRTC使用的框架（跟其他技术在一起使用），它被用在两端之间的连接，不管是何种网络类型 (通常用在视频或语音聊天)。这个协议让两端能够互相找到对方并建立一个连接，即便它们都使用了网络地址转译 (NAT) 去跟内网的其他设备共享了一个公网 IP 地址。

这个框架的算法是寻找最低等待时间的路径去连接两端，通常采用以下顺序寻找：

1. 直接的 UDP 连接 (在且仅在这种情况下，一个STUN的服务器会被用来查找主机端面向网络的地址)。
2. 直接的 TCP 连接，通过 HTTP 端口
3. 直接的 TCP 连接，通过 HTTPS 端口
4. 间接的连接通过中继器／TURN服务器 (如果一个直接连接失败了，比如当一个主机端位于防火墙之后阻止了 NAT 穿越)
参见
--

* WebRTC, 重要的使用 ICE 的网络相关协议
* WebRTC 协议
* RFC 5245，ICE 的 IETF 详细说明书
* `RTCIceCandidate` (en-US)，ICE candidate 的展现接口
Grid Row
========

**网格行**是Grid 布局中的水平轨道，即两个水平网格线之间的空间。它通过属性 `grid-template-rows` 或者简写属性 `grid`， `grid-template` 定义。

另外，当项目被放置到显示网格中创建的行外面时，可以在隐式网格中创建网格行。默认情况这些行自动调整大小，也可以使用 `grid-auto-rows` 属性指定其大小。

在Grid 布局中使用对齐方式时，网格行沿着横轴运行。

参见
--

### 属性参考

* `grid-template-rows`
* `grid-auto-rows`
* `grid`
* `grid-template`
### 扩展阅读

* CSS Grid Layout Guide: *Basic concepts of grid layout*
Canvas
======

HTML 的 *`<canvas>`* 元素提供了一个空白绘图区域，可以使用 APIs （比如 Canvas 2D 或 WebGL）来绘制图形。

更多信息
----

### 常规信息

* 在维基百科上查看 <canvas> 的解释
### 学习资源

* 查看 MDN 上的 canvas 教程
### 技术信息

* MDN 上关于 HTML5 `<canvas>` 元素的信息
* MDN 上关于 Canvas 的常规信息
* 画布 2D 绘图 API：`CanvasRenderingContext2D`
* Canvas 2D API 规格
Git
===

**Git** 是一个免费，开源，分布式源代码管理（版本控制） (SCM (en-US)) 系统。它有助于分布式开发团队维护代码库。与以前的 SCM 系统不同的是，它能在本地开发机器上进行常见操作（分支，提交等），而无需更改主存储库，甚至不需要主存储库的写入权限。

参见
--

* Git 官方网站
* GitHub，一个基于 Git 的图形化项目网站
Keyword
=======

**关键字**是用以描述内容的词汇或短语。网上的关键字在搜索引擎中用于搜索或者作为识别网站内容的词汇。

在使用搜索引擎的时候，你可以用关键字指定搜寻内容，搜索引擎会返回相关网页。想获得更精确的结果，尝试用更具体的关键字，比如用 "Blue Mustang GTO" 而不是简单的一个"Mustang".。网页也在 meta 标签 (在`<head>`部分) 中使用关键字来描述页面内容，以使搜索引擎可以更好地识别和组织网页。

参见
--

* 维基百科上的Keyword
Strict mode（严格模式）
=================

JavaScript 的**严格模式**是使用受限制的 JavaScript 的一种方式，从而隐式地退出“草率模式”。严格模式不仅仅是一个子集：这种模式有意地与普通情形下的代码有所区别。

通过在脚本文件/函数开头添加 `"use strict";` 声明，即可启用严格模式。

另请参见
----

* 严格模式
* 过渡到严格模式
LTR（从左到右）
=========

**LTR**（**从左到右**，Left To Right）是区域设置 (en-US)的属性之一，用于指示语言从左到右的书写方向。例如，使用美式英语的 `en-US` 区域就是从左到右的书写方向。

大多数西方语言，如同世界上的其他语言一样，都是从左向右书写的。

与 LTR 相对的是 RTL（从右到左，Right To Left），在另一些语言中常用，例如阿拉伯语（`ar`）和希伯来语（`he`）。

参见
--

* MDN Web 文档术语
    + locale (en-US)
    + 本地化
    + LTR（从左到右）
    + RTL（从右到左）
* HTML 全局属性
    + `dir`
    + `lang`
* CSS
    + `:dir`
    + `direction`
    + `unicode-bidi`
    + `writing-mode`
JavaScript
==========

JavaScript (JS) 是一种编程语言，为通常用于客户端（client-side）的网页动态脚本，不过，也常通过像Node.js这样的包，用于服务器端（server-side）。

不应该把 JavaScript 和 Java 混淆。“Java”和“JavaScript”都是 Oracle 公司在美国和其他国家注册的商标，但是这两种编程语言在语法、语义和使用方面都明显不同。

Brendan Eich（彼时受雇于 Netscape）为服务器端构想的语言 JavaScript，不久便在 1995 年 9 月被加入 Netscape Navigator 2.0。JavaScript 很快获得了成功，而 Internet Explorer 3.0 也在 1996 年 8 月，引入了对 JavaScript 的支持，冠以 JScript 之名。

1996 年 11 月，Netscape 开始与 ECMA 国际化组织合作以使 JavaScript 成为行业标准。从此以后，标准化的 JavaScript 就被称为 ECMAScript 并由 ECMA-262 规范，其最新版（第八版）在 2017 年 6 月生效。

JavaScript 通常用于浏览器，使开发者能通过DOM来操纵网页内容、或透过AJAX与IndexedDB来操作数据；还可以用它在canvas上面绘图、通过各种APIs与运行浏览器的各种设备交互……等等。由于近年来的发展、以及各浏览器的APIs性能改善，JavaScript 成了世界上最常用的编程语言之一。

最近，JavaScript 的流行程度，随着除浏览器外最流行的跨平台 JavaScript 运行环境——Node.js 平台的成功而大大提升。Node.js 使开发者可以在 PC 上使用 JavaScript 作为脚本语言以自动化处理和构建功能完备的 HTTP 和 Web Sockets (en-US) 服务器。

参见
--

* 维基百科上的JavaScript
* MDN 的 JavaScript 指南
* NodeSchool 的 javascripting 工坊
* codecademy.com 的 JavaScript 课程
* 最新的 ECMAScript 标准
* MDN 的 JavaScript 参考
* *Eloquent JavaScript* 一书
字符
==

一个*字符*（character）要么是一个可打印符号（字母、数字、标点符号)，或者是不可打印的“控制”符号（例如，回车、软连字符）。UTF-8 是最常见的字符集，包含了最流行的人类语言的字符。

参见
--

* 维基百科上的字符（计算机科学）
* 维基百科上的字符编码
* 维基百科上的 ASCII
* 维基百科上的 UTF-8
* 维基百科上的 Unicode
PNG
===

**PNG**（便携式网络图形）是支持无损数据压缩的图形文件格式。

参见
--

* 在维基百科上的 PNG
贝塞尔曲线
=====

**贝塞尔曲线**是一种使用数学方法描述的曲线，被广泛用于计算机图形学和动画中。在矢量图中，贝塞尔曲线用于定义可无限放大的光滑曲线。

贝塞尔曲线由至少两个控制点进行描述。Web 技术中使用的是三次贝塞尔曲线，即使用四个控制点 P0、P1、P2 和 P3 描述的曲线。

在绘制曲线的过程中，需要先作两条辅助线：P0 到 P1 和 P1 到 P2；辅助线的端点沿着所在连线平滑地移动到连线的另一端；采用同样的方法在辅助线 P0-P1 和 P1-P2 上绘制第三条辅助线；在第三条辅助线上将一个点从一端平滑地移向另外一端，这个点的运动轨迹就是贝塞尔曲线。下面是这个绘图过程的动态演示：

![绘制一条贝塞尔曲线](/zh-CN/docs/Glossary/Bezier_curve/b%C3%A9zier_2_big.gif)

参见
--

* 维基百科上的贝塞尔曲线词条
* CSS 中的贝塞尔时间函数
* `keySplines (en-US)` SVG 属性
XHR (XMLHttpRequest)
====================

`XMLHttpRequest` (XHR) 是一种创建 AJAX 请求的 JavaScript API 。它的方法提供了在浏览器和服务器之间发送请求的能力。

参见
--

* 维基百科上的 XMLHttpRequest
* 异步通信 vs. 同步通信
* `XMLHttpRequest` 对象
* MDN 上关于如何使用 XMLHttpRequest 的文档
CSP
===

内容安全策略（CSP）用于检测和减轻用于 Web 站点的特定类型的攻击，例如 XSS (en-US) 和数据注入等。

该安全策略的实现基于一个称作 `Content-Security-Policy` 的 HTTP 首部。

更多内容
----

### 常识

* Content Security Policy on Wikipedia
### 技术知识

* Content Security Policy documentation on MDN
动态类型
====

**动态类型语言**是那些像 JavaScript 语言那样，其解释器在运行时根据变量当时的值分配类型。

参见
--

* JavaScript 数据类型和数据结构
* 维基百科上的类型系统词条
Synchronous（同步）
===============

各方都实时（或者尽可能实时）地收取（而且必要的话也处理或者回复）信息的即时沟通方式，即为**同步**。

电话即为一个日常的例子：人们都倾向于在使用电话时即时地作出回应。

许多程序指令也是实时的：例如当输入一个算式时，除非编程人员有意为止，否则环境都会**立即**将结果反馈回来。

参见
--

* Asynchronous
* 使用了 XMLHttpRequest() API 的同步和异步请求
TURN
====

**TURN** (NAT 的中继穿越) 是一个能够让位于Network Address Translator(NAT) 或者防火墙之后的主机接受和发送数据的protocol(协议)。

参见
--

* TURN 在 Wikipedia
* WebRTC 协议
* 规范
* IPv6 版最新规范
基于原型编程
======

**基于原型编程**是一种面向对象编程的风格。在这种风格中，我们不会显式地定义类，而会通过向其他类的实例（对象）中添加属性和方法（甚至偶尔向空对象添加）来创建类。

简单来说，这种风格是在不定义类的情况下创建一个对象。

参见
--

* 基于原型编程的维基页面
编译时间
====

编译时间是指程序从被加载到程序被解析完成所用的时间。

参见
--

* Compile time on Wikipedia
ARPA
====

**.arpa** (address and routing parameter area，地址路由参数域 ) 是专门用来互联网基础设施配置的顶级域top-level domain (en-US) ，尤其是 DNS 反向解析，即从 IP 地址) 找出旗下的主机名 (i.e., find the domain name 。

参见
--

* 官方网站
* .arpa，来自维基百科
对页面预解析进行优化
==========

在传统的浏览器中，HTML 解析器运行于主线程之中，并且在遇到 `</script>` 标签后会被阻塞，直到脚本从网络中被获取和执行。Firefox 4 和后续的版本支持从主线程中分离的预解析技术。当脚本在获取和执行的过程中，预解析技术能提前解析 HTML 文档。在 Firefox 3.5 和 3.6 中，HTML 解析器能够在文档流中预先加载脚本、层叠样式表和图片。然而，在 Firefox 4 和后续的版本中 HTML 解析器也预先运行 HTML 树构建算法。这一举措的优点是当预解析成功后，就没有必要再重新解析已经扫描过并且成功下载的脚本，层叠样式表和图片；缺点就是当预解析失败之后，有很多工作需要去做。

这篇文档旨在帮助你避免预解析失败和页面加载变慢。

使预加载成功
------

让脚本、层叠样式表和图片预加载成功的规则只有一条：

* 如果你使用 `<base>` 元素重载页面的基 URI，将这个元素放置到文档的非脚本部分。不要通过 `document.write()` 或者 `document.createElement()` 添加。
避免树构建器的输出丢失
-----------

当 `document.write()` 改变了文档树的状态时，树构建器的预构建过程会失败。例如，当所有被 `document.write()` 插入的内容被解析之后 `</script>` 标签后的预处理状态不再持有。然而，只有不寻常地使用 `document.write()` 才会产生问题。这些事情需要避免：

* 不要写不对称的文档树。`<script>document.write("<div>");</script>` 很糟糕。`<script>document.write("<div></div>");</script>` 则是可行的。
* 不要写未完成的标识。 `<script>document.write("<div></div");</script>` 很糟糕。
* 不要以回车结束内容。 `<script>document.write("Hello World!\r");</script>` 很糟糕。 `<script>document.write("Hello World!\n");</script>` 则是可行的。
* 注意即使对称的标签也可能导致文档的不对称。比如：`head` 元素中的`<script>document.write("<div></div>");</script>` i 会被解析成 `<script>document.write("</head><body><div></div>");</script>` 因次文档是不对称的。
* 不要仅格式化部分表格。 `<table><script>document.write("<tr><td>Hello World!</td></tr>");</script></table>` 很糟糕。然而， `<script>document.write("<table><tr><td>Hello World!</td></tr></table>");</script>` 则是可行的。
* TODO: 在其他格式化元素中使用 document.write。
事件
==

事件（Event）是由 DOM 元素产生的资源，它可以由 JavaScript 代码操作。

参见
--

* MDN 上的事件文档
* 官方网站
* 维基百科上的 DOM 事件词条
RTL（从右到左）
=========

**RTL**（**从右到左**，Right To Left）是区域设置 (en-US)的属性之一，用于指示语言从右到左的书写方向。

举个例子，希伯来语（`he`）指定从右往左书写，而阿拉伯语（`ar`）也是另一种从右往左书写的常见语言。

与 RTL 相对的是 LTR（从左到右，Left To Right），用于包括英语（`en`、`en-US`、`en-GB` 等等）、西班牙语（`es`）及法语（`fr`）在内的其他语言。

参见
--

* MDN Web 文档术语
    + 本地化
    + LTR（从左到右）
    + RTL（从右到左）
假值
==

**假值**（**falsy**，有时写为 **falsey**）是在 Boolean 上下文中认定为 false 的值。

JavaScript 在需要用到布尔类型值的上下文中使用强制类型转换将值转换为布尔值，例如条件语句 (en-US)和循环语句 (en-US)。

下列表格提供了 JavaScript 的所有假值。

| 值 | 说明 |
| --- | --- |
| `false` | 关键字 `false`。 |
| `0` | `Number` 零值（同理，`0.0`、`0x0` 也为零）。 |
| `-0` | `Number` 负零值（同理，`-0.0`、`-0x0` 也为负零）。 |
| `0n` | `BigInt` 零值（`0x0n` 同理）。注意没有 `BigInt` 负零值——`0n` 的相反数还是 `0n`。 |
| `""`、`''`、```` | 空字符串值。 |
| null | null 值——任意值缺失。 |
| undefined | undefined 值——初始值。 |
| NaN | NaN 值——非数值。 |
| `document.all` | 当且仅当对象具有 [[IsHTMLDDA]] 内部插槽时，它才是假值。这个槽只存在于 `document.all` 中，不能用 JavaScript 来设置。 |

示例
--

JavaScript 中*假*值的例子（在布尔值上下文中被转换为 false，从而*绕过*了 `if` 代码块）：


```js
if (false) {
  // 执行不到这里
}

if (null) {
  // 执行不到这里
}

if (undefined) {
  // 执行不到这里
}

if (0) {
  // 执行不到这里
}

if (-0) {
  // 执行不到这里
}

if (0n) {
  // 执行不到这里
}

if (NaN) {
  // 执行不到这里
}

if ("") {
  // 执行不到这里
}
```

### 逻辑与操作符 &&

如果第一个对象是假值，则返回那个对象：


```js
console.log(false && "dog");
// ↪ false

console.log(0 && "dog");
// ↪ 0
```

参见
--

* 真值
* 强制转换
* 布尔值
* 布尔值转换
伪类
==

在 CSS 中，一个伪类选择器只依据元素的状态，而不是元素在文档树中的信息，来选择目标对象。举例来说，选择器 `a``:visited` 仅仅应用于那些用户已经浏览过的连接。

参见
--

* 伪类文档
Semantics（语义）
=============

在编程中，**语义**指的是一段代码的含义 — 例如 "运行这行 JavaScript 代码会产生怎样的影响？", 或者 "这个 HTML 的元素有什么作用，扮演了什么样的角色"（而不只是 "它看上去像是什么？"。）

JavaScript 中的语义
---------------

JavaScript 中，考虑一个函数，该函数接受一个字符串参数，然后返回一个以该字符串为文本内容的`<li>`元素。如果该函数调用是`build('Peach')`，你会需要去看代码才能理解该函数做了什么吗，如果是`createLiWithContent('Peach')`呢？

CSS 中的语义
--------

CSS 中，考虑给一个列表设置样式，`li` 元素代表不同类型的水果。通过 `div > ul > li`，你能知道 DOM 的那一部分会被选择中吗？但如果是 `.fruits__item` 呢？

HTML 中的语义
---------

HTML 中，例如，`<h1>` (en-US) 元素是一个语义化元素，赋予了它包裹着的文本“这个页面中最高级别标题功能“的角色 (或含义) 。


```html
<h1>This is a top level heading</h1>
```


默认情况下，绝大多数浏览器的 user agent stylesheet 将会赋予一个 `<h1>` (en-US) 元素很大的字号尺寸从而使它看上去更像是一个标题（虽然你可以把它格式化为任何你想要的样式），但是更重要的是它的语义会被在很多地方以不同的方式被使用到，例如搜索引擎会把它包含的内容作为一个重要的关键词，从而影响这个页面在搜索结果中的排序（参见SEO），而且屏幕阅读器会使用它来帮助视障用户更好的使用这个页面。

另一方面，你可以通过样式（CSS）来让任何的元素*看上去*像是一个最高级别的标题，就像下面所展示的方法一样：


```html
<span style="font-size: 32px; margin: 21px 0;"
 >Is this a top level heading?</span
>
```


这将会把这个元素渲染得像是一个最高级别的标题，但是它的值没有对应到最“最高级别标题”这一语义，所以在此之上，它不会获得更多额外的描述（只是一个普通“span”元素而不是“最高级别标题”这一语义）。所以在恰当的需求下使用恰当的 HTML 元素是一个不错的主意。

HTML 应该编写为表示将要填充的数据，而不是基于其默认的演示样式。演示（应该是什么样子），是 CSS 的唯一责任。

写语义标记的一些好处如下：

* 搜索引擎将其内容视为影响页面搜索排名的重要关键字（参见 SEO）。
* 屏幕阅读器可以将其用作指引，帮助视力受损的用户导航页面。
* 比起搜索无休止的带有或不带有语义/命名空间类的 `div`，找到有意义的代码块显然容易得多。
* 向开发人员建议将要填充的数据类型。
* 语义命名反映了正确的自定义元素/组件命名。

当接近要使用的标记时，问问自己，“什么元素最能描述/表示我要填充的数据？”例如，它是数据列表吗？有序或无序？是否是一篇具有章节和相关信息旁注的文章？它是否列出了定义？它是需要标题的图形还是图像？除了全局网站范围的页眉和页脚之外，它还应该有页眉和页脚吗？等等。

语义化元素
-----

这是一些语义化的元素（source）。

* `<article>`
* `<aside>`
* `<details>`
* `<figcaption>`
* `<figure>`
* `<footer>`
* `<header>`
* `<main>`
* `<mark>`
* `<nav>`
* `<section>`
* `<summary>`
* `<time>`
参见
--

* HTML element reference on MDN
* Using HTML sections and outlines on MDN
* The meaning of semantics in computer science on Wikipedia
* Glossary
    + SEO
SMTP
====

**SMTP**（Simple Mail Transfer Protocol，简单邮件传输协议）是用于发送的邮件的协议。类似于POP3 (en-US)和NNTP (en-US)，它是一个状态机 (en-US)驱动的协议

该协议相对简单。最复杂的部分在于添加支持不同的验证机制（GSSAPI， CRAM-MD5，NTLM，MSN，AUTH LOGIN，AUTH PLAIN 等），处理错误响应以及在验证机制错误时进行状态回退（如服务器声明其支持某种机制但其实并不）。

参见
--

* 术语表
    + NNTP (en-US)
    + POP3 (en-US)
    + 协议
    + 状态机 (en-US)
* 维基百科
    + SMTP
Metadata
========

**Metadata**——元数据，简单的来说就是描述数据的数据。例如，一个 HTML 文件是一种数据，但 HTML 文件也能在 `<head>` 元素中包含描述该文档的元数据，比如该文件的作者和概要。

更多相关内容
------

### 通俗释义

* metadata 来自维基百科
### HTML 中的 metadata 元素

* `<meta>` 来自 MDN
实体报头
====

**备注：** 当前的 HTTP/1.1 规范中不再提及实体、实体报头和实体的体。这中的有些字段现在被称为表示头字段（RFC 7231, section 3: Representations）。

实体报头是描述了一个 HTTP 消息有效载荷（即关于消息主体的元数据）的 HTTP 报头，见 HTTP header。实体报头包括 `Content-Length`、`Content-Language`、`Content-Encoding`、`Content-Type` 和 `Expires` 等。实体报头可能同时存在于 HTTP 请求和响应信息中。

尽管实体报头既非请求或响应报头，（由于它经常出现在请求头或响应头中）它们通常包含于此类概念中。

在下面的例子中，`Content-Length` 是实体报头，而 `Host` 和 `User-Agent` 是请求报头。
```

POST /myform.html HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Content-Length: 128
```

更多信息
----

### 技术知识

* 所有 HTTP 报头列表
Java
====

Java 是一个旨在实现最小的依赖关系的基于类的 面向对象的 便携式 计算机程序 语言。

参见
--

* 在维基百科上的 Java
REST
====

**REST**（Representational State Transfer，表现层状态转换）是一组软件架构设计规范，可实现高效、可靠和可拓展的分布式系统。

REST 的基本概念是资源（resource），例如文件能通过明确和标准的操作与格式，转换其状态与超文本的关系。通常在 API's 或服务能直接修改文件的类型，而非触发其他行为时，它们就称自己为 RESTful。

由于万维网 Web 背后的 HTTP 协议也能传输文件和超文本链接，同时又充当了标准，简易的 HTTP API 虽然有时不一定遵守所有的 RESTful 规范，但它们还是会被称为 RESTful API、RESTful 服务，或者直接叫 REST 服务。初学者可以先假设 REST API 代表一个能通过标准 web 库和工具调用的 HTTP 服务。

参见
--

* restapitutorial.com
* restcookbook.com
* REST on Wikipedia
* REST Architecture
OpenGL
======

**OpenGL (Open Graphics Library)**是一套用来渲染 2D 和 3D 矢量图形的跨语言的、跨平台的应用程序接口 (API) . 这种接口通常用来与图形处理单元 (GPU) 交互，来达到硬件加速渲染的目的**。**

参见
--

* OpenGL on Wikipedia
URI
===

**URI**（统一资源标识符）是一个指向资源的字符串。最通常用在 URL 上来指定 Web 上资源文件的具体位置。相比之下，URN 是在给定的命名空间用名字指向具体的资源，如：书本的 ISBN。

参见
--

* 在维基百科上的 URI
* RFC 3986 on URI
原始值
===

在 JavaScript 中，**原始值**（原始数据类型）是一种既非对象也无方法或属性的数据。有 7 种原始数据类型：

* string
* number
* bigint
* boolean
* undefined
* symbol
* null

多数情况下，原始值直接代表了最底层的语言实现。

所有原始值都是*不可变*的，即它们的值不能被修改。重要的是不要将原始值本身与分配了原始值的变量混淆。变量可能会被重新赋予一个新值，但存在的值不能像数组、对象以及函数那样被修改。语言不提供改变原始值的工具方法。

基本类型没有方法，但仍然表现得像有方法一样。当在原始值上访问属性时，JavaScript *自动*将值*装入*包装对象中，并访问该对象上的属性。例如，`"foo".includes("f")` 隐式创建了一个 `String` 包装对象，并在该对象上调用 `String.prototype.includes()`。这种自动装箱行为在 JavaScript 代码中是无法观察到的，但却是各种行为的一个很好的心理模型——例如，为什么“修改”原始值不起作用（因为 `str.foo = 1` 不是赋值给 `str` 本身的 `foo` 属性，而是赋值给了一个临时包装对象）。

参见
--

* JavaScript 数据类型
* 原始数据类型（维基百科）
* 术语表
    + JavaScript
    + string
    + number
    + bigint
    + boolean
    + null
    + undefined
    + symbol
HTTP/3
======

**HTTP/3**是继HTTP/2即将到来的HTTP 网络协议的主要修订版。HTTP/3 的要点是它使用名为 QUIC 的新UDP协议代替TCP。

参见
--

* 基础知识
    + HTTP on MDN
    + HTTP/3
* 词汇表
    + HTTP
    + HTTP 2
    + Latency
空元素
===

**空元素**（empty element）是 HTML 中**不能**存在子节点（例如内嵌的元素或者文本节点）的元素。空元素只有开始标签且不能指定结束标签。

在 HTML 中，空元素不能有结束标签。例如，`<input type="text"></input>` 是无效的 HTML。相反，不能有任何子节点的 SVG 或 MathML 元素可以使用结束标签来代替 XML 开始标签中的自闭合标签语法。

HTML、SVG 和 MathML 的规范都详细定义了每个元素能包含的具体内容。所以一些标签的组合是没有任何语义的。

尽管无法使用具有子元素的空元素标记，但可以使用 JavaScript 在这些元素的 DOM 中添加子节点。但这并不是一个被推荐的做法，因为其结果不可靠。

在 HTML 中有以下空元素：

* `<area>`
* `<base>`
* `<br>`
* `<col>`
* `<embed>`
* `<hr>`
* `<img>`
* `<input>`
* `<link>`
* `<meta>`
* `<param>` 
已弃用
* `<source>`
* `<track>`
* `<wbr>`
自闭合标签
-----

*HTML 中不存在自闭合标签（`<tag />`）。*

如果一个 HTML 元素的开始标签中存在尾随的 `/`（斜杠）字符，HTML 解析器会忽略该斜杠字符。请记住一些元素（例如 `<script>` 或 `<ul>`）的确需要结束标签。在这种情况下，在开始标签中添加尾随斜杠不会闭合元素。

但是，某些代码格式化工具会在空元素的开始标签中添加尾随斜杠字符，以使其兼容 XHTML 并更易读。例如，某些代码格式化工具会将 `<input type="text">` 转换为 `<input type="text" />`。

XML、XHTML 和 SVG 的空元素则必须使用自闭合标签（例如 `<circle cx="50" cy="50" r="50" />`）。

在 SVG 和 MathML 中，有任何子节点的元素不允许使用自闭合标签。在这种情况下，如果元素的开始标签被标记为自闭合，则该元素不能有结束标签。

**备注：** 如果开始标签中的尾随 `/`（斜杠）字符直接位于未使用引号包裹的属性值之后（两者之间没有空格），则该斜杠字符将成为属性值的一部分，而不是被解析器丢弃。例如，标记 `<img src=http://www.example.com/logo.svg/>` 会导致 `src` 属性的值为 `http://www.example.com/logo.svg/`——这会导致 URL 错误。

参见
--

* 可替换元素
Regular expression
==================

**正则表达式**（*Regular expressions*或 *regex*）是决定了在搜索中使用何种字符串序列的规则。

正则表达式在多种语言中都得到了实现，但是最知名的实现，当属 Perl 的实现。该实现引出了名为 PCRE（*Perl Compatible Regular Expression*）的生态系统。在 Web 中，JavaScript 通过 `RegExp` 对象，给出了正则表达式的另一种实现。

参见
--

* 在维基百科上的 正则表达式
* 互动教程
* 虚拟化的正则表达式
* 在 JavaScript 中写正则表达式
document environment
====================

当 JavaScript 所处的全局环境为 window 或 iframe 时，这种环境被称为*全局文档环境*。全局的文档环境处于所有环境的顶层，即没有更外层的环境。

参见
--

* document environment 的 HTML 规范
Blink
=====

Blink 是一个开源的浏览器布局引擎，由谷歌作为 Chromium 项目的一部分开发（因而也是 Chrome 的一部分）。具体而言，Blink 是一个派生自 WebKit (en-US) 项目中 WebCore 库的分支，用于处理布局、渲染以及 DOM。

参见
--

* Blink 项目主页（英文）
* Wikipedia 上的信息：Blink
* Blink 的 FAQ （英文）
浅拷贝
===

对象的**浅拷贝**是其属性与拷贝源对象的属性共享相同引用（指向相同的底层值）的副本。因此，当你更改源或副本时，也可能导致其他对象也发生更改——也就是说，你可能会无意中对源或副本造成意料之外的更改。这种行为与深拷贝的行为形成对比，在深拷贝中，源和副本是完全独立的。

对于浅拷贝，有选择地更改对象中现有元素的共享属性的值与给现有元素赋一个全新的值是不同的，理解这一点很重要。

例如，如果在一个数组对象名为 `copy` 的浅拷贝中，`copy[0]` 元素的值是 `{"list":["butter"，"flour"]}`，然后执行 `copy[0].List = ["oil"，"flour"]`，那么源对象中的相应元素也将发生变化——因为你有选择地更改了源对象和浅拷贝共享的对象的属性。

然而，如果你做的是 `copy[0] = {"list":["oil"，"flour"]}`，那么源对象中的对应元素将**不会改变**——因为在这种情况下，你不仅仅是有选择地改变了浅拷贝与源对象共享的现有数组元素的属性；相反，你实际上是在浅拷贝中分配了一个全新的值给 `copy[0]` 数组元素。

在 JavaScript 中，所有标准的内置对象复制操作（展开语法、`Array.prototype.concat()`、`Array.prototype.slice()`、`Array.from()`、`Object.assign()` 和 `Object.create()`）创建的是浅拷贝而不是深拷贝。

示例
--

考虑以下示例，其中创建了一个 `ingredients_list` 数组对象，然后通过复制 `ingredients_list` 对象创建了一个 `ingredients_list_copy` 对象。


```js
let ingredients_list = ["noodles", { list: ["eggs", "flour", "water"] }];

let ingredients_list_copy = Array.from(ingredients_list);
console.log(JSON.stringify(ingredients_list_copy));
// ["noodles",{"list":["eggs","flour","water"]}]
```


改变 `ingredients_list_copy` 中 `list` 属性的值也将导致 `ingredients_list` 源对象中的 `list` 属性发生变化。


```js
ingredients_list_copy[1].list = ["rice flour", "water"];
console.log(ingredients_list[1].list);
// Array [ "rice flour", "water" ]
console.log(JSON.stringify(ingredients_list));
// ["noodles",{"list":["rice flour","water"]}]
```


为 `ingredients_list_copy` 中的第一个元素赋值，不会导致 `ingredients_list` 源对象中的第一个元素发生任何变化。


```js
ingredients_list_copy[0] = "rice noodles";
console.log(ingredients_list[0]);
// noodles
console.log(JSON.stringify(ingredients_list_copy));
// ["rice noodles",{"list":["rice flour","water"]}]
console.log(JSON.stringify(ingredients_list));
// ["noodles",{"list":["rice flour","water"]}]
```

参见
--

* 深拷贝
禁止修改的响应标头
=========

*禁止修改的响应标头*是一个无法通过编程方式修改的 HTTP 标头（`Set-Cookie`）。

参见
--

* Fetch specification: forbidden response-header name
* 禁止修改的标头（术语表）
Array（数组）
=========

数组对象是一个有序的数据（根据语言不同，数据可以是原始类型或对象类型）集合。相对于变量，数组可用于在一个变量中存储多个变量值。

数组中的每一项都有可供访问的数字索引。在 JavaScript 中，数组索引从 0 开始，并可以使用多种方法操作。

JavaScript 中的数组形式如下：


```js
let myArray = [1, 2, 3, 4];
let catNamesArray = ["Jacqueline", "Sophia", "Autumn"];
//Javascript 数组可以包含不同类型的数据，如上所示。
```

参见
--

* 维基百科的数组词条
* MDN JavaScript `Array` 参考
SPA（单页应用）
=========

SPA（Single-page application，单页应用）是只加载一个单独网页的 web 应用实现，当需要显示不同的内容时，它通过 JavaScript API（例如 `XMLHttpRequest` 和 Fetch）更新主体内容。

这使得用户在访问网站时无需加载新的页面，可以获得性能提升和动态的体验，但会相应地丧失诸如 SEO（搜索引擎优化）的优势，同时需要更多精力维护状态、实现导航以及做一些有意义的性能监控。

参见
--

* 单页应用（维基百科词条）
* 理解客户端 JavaScript 框架
* 术语表
    + API
    + AJAX
    + JavaScript
* 著名的单页应用框架：
    + React
    + Angular
    + Vue.JS
Viewport
========

在电脑图形学里面，视口代表了一个可看见的多边形区域（通常来说是矩形）。在浏览器范畴里，它代表的是浏览器中网站可见内容的部分。视口外的内容在被滚动进来前都是不可见的。

视口当前可见的部分叫做**可视视口**（visual viewport）。可视视口可能会比**布局视口**（layout viewport）更小，因为当用户缩小浏览器缩放比例时，布局视口不变，而可视视口变小了。

参见
--

* Viewport 维基百科
码位（code point）
==============

**码位**是表示文本的系统（例如 Unicode）中用于表示抽象字符的数值。在 Unicode 中，码位以“U+1234”的形式表示，其中的“1234”是分配的数值。例如，字符“A”被分配的码位是 U+0041。

字符编码形式（例如 UTF-8 和 UTF-16）决定了如何将 Unicode 码位编码成一个字节序列。不同的编码形式可以将相同的码位编码成不同的字节序列：例如，西里尔字符“Ф”，它的码位是 U+0424，在 UTF-8 中的编码为 `0xd0a4`，在 UTF-16 中的编码为 `0x0424`。

参见
--

* Unicode 标准：码位和字符
CalDAV
======

CalDAV（WebDAV 的日历扩展 (Calendaring extensions to WebDAV)）是一种由 IETF (en-US) 标准化的协议，用于远程访问服务器上的日历数据。

参见
--

* 维基百科上的 CalDAV
* RFC 4791: Calendaring extensions to WebDAV (CalDAV)
* RFC 6638: Scheduling Extensions to CalDAV
Information architecture
========================

应用于 web 设计和开发的信息架构是组织一个 web 站点的信息、内容和功能的实践，信息和服务的易使用和易查找使得它能提供最好的用户体验。

参见
--

* Information architecture on Wikipedia
Class（类）
========

在面向对象编程中（object-oriented programming）, 一个 *类* 定义了一个对象（object's）的特征。类是定义对象属性（properties）和方法（methods）的模板，是用来绘制具体对象实例的“蓝图”.

参见
--

* Class-based vs. prototype-based programming languages (like JavaScript)
* Using functions as classes in JavaScript
* Class-based programming on Wikipedia
* Object-oriented programming on Wikipedia
Cross-site scripting（跨站脚本攻击）
============================

跨站脚本攻击（Cross-site scripting，XSS）是一种安全漏洞，攻击者可以利用这种漏洞在网站上注入恶意的客户端代码。若受害者运行这些恶意代码，攻击者就可以突破网站的访问限制并冒充受害者。根据开放式 Web 应用安全项目（OWASP），XSS 在 2017 年被认为 7 种最常见的 Web 应用程序漏洞之一。

如果 Web 应用程序没有部署足够的安全验证，那么，这些攻击很容易成功。浏览器无法探测到这些恶意脚本是不可信的，所以，这些脚本可以任意读取 cookie，session tokens，或者其他敏感的网站信息，或者让恶意脚本重写HTML内容。

在以下 2 种情况下，容易发生 XSS 攻击：

1. 数据从一个不可靠的链接进入到一个 Web 应用程序。
2. 没有过滤掉恶意代码的动态内容被发送给 Web 用户。

恶意内容一般包括 JavaScript，但是，有时候也会包括 HTML，FLASH 或是其他浏览器可执行的代码。XSS 攻击的形式千差万别，但他们通常都会：将 cookies 或其他隐私信息发送给攻击者，将受害者重定向到由攻击者控制的网页，或是经由恶意网站在受害者的机器上进行其他恶意操作。

XSS 攻击可以分为 3 类：存储型（持久型）、反射型（非持久型）、DOM 型。

**存储型 XSS**

注入型脚本永久存储在目标服务器上。当浏览器请求数据时，脚本从服务器上传回并执行。

**反射型 XSS**

当用户点击一个恶意链接，或者提交一个表单，或者进入一个恶意网站时，注入脚本进入被攻击者的网站。Web 服务器将注入脚本，比如一个错误信息，搜索结果等 返回到用户的浏览器上。由于浏览器认为这个响应来自"可信任"的服务器，所以会执行这段脚本。

**基于 DOM 的 XSS**

通过修改原始的客户端代码，受害者浏览器的 DOM 环境改变，导致有效载荷的执行。也就是说，页面本身并没有变化，但由于 DOM 环境被恶意修改，有客户端代码被包含进了页面，并且意外执行。

参见
--

* Type of Attacks: Cross-site scripting (XSS) (en-US)
* Cross-site scripting on Wikipedia
* Cross-site scripting on OWASP
* Another article about Cross-site scripting
ECMAScript
==========

**ECMAScript** 是 JavaScript 所基于的脚本语言。Ecma 国际组织 负责将 ECMAScript 标准化。

参见
--

* 维基百科上的 ECMAScript
* ECMAScript
算法
==

算法是一个良定义的具体计算步骤的一个序列。

换句话说，一个算法就是由人或机器可重复的解决问题的方法。计算机科学家们使用算法的复杂度（又称 O 标记法）来表示算法的效率。

例如：

* 一道菜谱就是供人使用的算法
* 一种编程中常用的排序算法就是用来描述计算机如何给数据排序的

常用的算法有寻找最优路径算法，例如“旅行推销员问题”、“树的遍历算法”等。

还有很多机器学习算法例如“线性回归”、“决策树”、“随机森林”、“支持向量机”、“循环神经网络（RNN）”、“长短时记忆（LSTM）神经网络”、“卷积神经网络（CNN）”、“深度卷积神经网络”等。

参见
--

* Algorithm，维基百科
* Explanations of sorting algorithms
* Explanations of algorithmic complexity
String
======

在任何计算机编程语言中，字符串都是用于表示文本的字符序列。

在 JavaScript 中，字符串是基本类型的其中一个，而 `String` 是 wrapper (en-US) 围绕字符串的基本形式。

参见
--

* 维基百科上的字符串
* JavaScript 数据类型和数据结构
正常模式
====

因为翻译原因，正常模式也被翻译为——马虎模式/稀松模式/懒散模式

ECMAScript 5 以及其后续的版本可以选择性的使用一种新模式——严格模式 (strict mode)，这种严格模式在多个方面改变了 JavaScript 的语义，从而使得当出现问题时我们更好的理解到底发生了什么。

常见的，非严格模式——平时我们会称之为正常模式 (\*\*sloppy mode)，\*\*这并不是一个官方说法，但是你会经常见到如上的一些说法，其意义就是指代非严格模式，即正常模式。

参见
--

* "Strict Mode"，第七章 ("JavaScript Syntax")，《Speaking *JavaScript》*
标识符
===

**标识符**是代码中用来标识变量、函数或属性的字符序列。

在 JavaScript 中，标识符只能包含字母或数字或下划线（“\_”）或美元符号（“$”），且不能以数字开头。标识符与字符串不同之处在于字符串是数据，而标识符是代码的一部分。在 JavaScript 中，无法将标识符转换为字符串，但有时可以将字符串解析为标识符。

参见
--

* Identifier on Wikipedia
DoS 攻击
======

DoS（拒绝服务攻击，Denial of Service）是一种网络攻击手段，它通过给服务器发送大量请求来阻止对资源的合法使用。

计算机资源有限，比如算力和内存。当这些资源过载时，程序可能会发生冻结或崩溃，使程序不可用。DoS 攻击结合多种技术来消耗资源，使合法用户无法使用服务器或网络，或者至少让服务器反应迟缓。

分布式拒绝服务（Distributed Denial of Service，DDoS）攻击是一种使用大量服务器来耗尽一台被攻击电脑的资源的攻击方式。

### DoS 攻击类型

DoS 攻击更多的是一种类型而非特定的某种攻击。下面是 DoS 攻击的不完全列表：

* 带宽攻击
* 服务请求洪泛
* SYN 洪泛攻击
* ICMP 洪泛攻击
* 点对点攻击
* 永久 DoS 攻击
* 应用层洪泛攻击
参见
--

* 维基百科拒绝服务攻击词条
* OWASP 介绍的拒绝服务攻击
* DDoS