recursal/MDN huggingface dataset:
Gutters
=======

**网格间距**是网格轨道之间的间距，可以通过 `grid-column-gap` (en-US)，`grid-row-gap` (en-US) 或者 `grid-gap` (en-US) 在Grid 布局中创建。

在下面的例子中，由一个三列两行的网格。它的列轨道之间有 20px 的间距，行轨道之间有 20px 的间距。

示例
--
```

\* {
  box-sizing: border-box;
}

.wrapper {
  border: 2px solid #f76707;
  border-radius: 5px;
  background-color: #fff4e6;
}

.wrapper > div {
  border: 2px solid #ffa94d;
  border-radius: 5px;
  background-color: #fff8f8;
  padding: 1em;
  color: #d9480f;
}
```



```css
.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 1.2fr);
  grid-auto-rows: 45%;
  grid-column-gap: 20px;
  grid-row-gap: 20px;
}
```



```html
<div class="wrapper">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
  <div>Four</div>
  <div>Five</div>
</div>
```


在网格大小上，网格间距参与计算就好像规则的网格轨道一样，但是没有任何东西可以被放置到网格间距上。网格间距也像网格线一样在那个位置会增加额外的大小，因此网格项目会被放置在网格间距末的那条网格线后。

能够导致轨道被间隔开来的，除了网格间距属性，还有 margins，padding 或者使用盒模型对齐中的空间分布属性。这些方法都会导致可见间距的产生，因此网格间距属性不等价于”间距大小“，除非你没有使用这些能够产生间距的方法。

参见
--

### 属性参考

* `grid-column-gap` (en-US)
* `grid-row-gap` (en-US)
* `grid-gap` (en-US)
### 扩展阅读

* CSS Grid Layout Guide: *Basic concepts of grid layout*
* Definition of gutters in the CSS Grid Layout specification
密码学
===

**密码学**是研究如何安全地编码和传递消息的学科。密码学设计和研究用于在不安全环境中编码和解码消息，以及它们的应用。

除了**数据机密性**，密码学还涉及**身份识别**、**身份验证**、**不可否认**以及**数据完整性**。因此，它还研究在上下文中密码方法的使用，这称为**密码系统**。

参见
--

* 维基百科上的密码学
* MDN Web 文档术语
    + 分组密码工作模式
    + 密码
    + 密文
    + 密码套件
    + 密码分析 (en-US)
    + 解密
    + 加密
    + 密钥
    + 明文
    + 非对称加密 (en-US)
    + 对称密钥加密 (en-US)
CRLF
====

回车符（CR）和换行符（LF）是文本文件用于标记换行的控制字符或字节码。

* CR = **Carriage Return**，回车符号（`\r`，十六进制为 `0x0D`，十进制为 13），用于将光标移动到行首，并不前进至下一行。
* LF = **Line Feed**，换行符号（`\n`, 十六进制为 `0x0A`，十进制为 10）。

紧邻的 CR 和 LF（组成 CRLF，`\r\n`，或十六进制 `0x0D0A`）将光标移动到行首，然后再移动至下一行。

参见
--

* 维基百科上的换行符
* 维基百科上的回车符
Prototype
=========

原型是一种在开发生命周期的早期显示应用程序或产品的外观和行为的模型。

请参见 继承和原型链

参见
--

* Software Prototyping 维基百科
明文
==

明文指的是作为加密算法输入的信息，或者是解密后的密文。

通常与指代任何信息（例如文本文档、图像等）的 *cleartext* 一词交互使用，此时信息还没有被加密，可不附加任何处理地供人类和计算机阅读。
SVG
===

可缩放矢量图形 (**SVG**) 是一个基于 XML 语法的 2D 矢量图形格式。

W3C (en-US) 于 20 世纪 90 年代末开始着手 SVG 的工作，但是当 Internet Explorer 9 推出 SVG 支持时，SVG 才变得流行起来。现在所有主流 browsers 都支持 SVG。

基于 XML 语法，你可以使用 CSS 指定 SVG 的样式，并使用 JavaScript 进行交互。HTML5 现在允许将 SVG tags 直接嵌入到 HTML 文档中。

作为一种矢量图像格式，SVG 图形可以无限地扩展，这使其在 responsive design (en-US) 中非常有用，因为你可以创建可缩放到任意屏幕大小的界面元素和图形。SVG 还提供了一组有用的工具，例如裁剪，遮罩，过滤器和动画。

参见
--

* 维基百科上的 SVG
* W3.org's SVG Primer
* SVG documentation on MDN
* Latest SVG specification
可序列化对象
======

**可序列化对象**（Serializable object）是可以在任何 JavaScript 环境（领域，realm）中序列化、反序列化的对象。例如，这允许将此类对象存储在磁盘上并在以后进行恢复，或使用 `structuredClone()` 对它们进行拷贝，又或者使用 `DedicatedWorkerGlobalScope.postMessage()` (en-US) 在 Worker 之间共享它们。

序列化可能不包括原始对象的所有属性和其他方面的内容。例如，对 `DOMException` 的序列化必须包含 `name` 和 `message` 属性，但是否包含其他属性则取决于具体实现。因此，反序列化的对象并不一定是与原始对象相同的拷贝。但是，反序列化得到的新的对象将会是一个深拷贝，因此任何从原始对象序列化并反序列化到新的对象的属性都不会和原始对象共享任何引用。

在某些情况下，当序列化和反序列化一个对象时，可能会转移一些资源而非拷贝它们。可以转移的对象被称为可转移对象。

支持的对象
-----

所有的基本类型都是可以被序列化的。但并非所有的对象都是可序列化对象。可以被序列化的对象在结构化克隆算法 > 支持的类型中列出。

**备注：** 可序列化对象在 Web IDL 文件中使用属性 `[Serializable]` 标记。
Descriptor (解释器) (CSS)
======================

一个 **CSS 解释器**定义一条 `@ 规则`的属性。一条 @ 规则可以有一条或多条解释器。每一条解释器拥有：

* 一个名称
* 一个值，用于定义其名称的属性
* 一个可选的 "!important" 标识，默认不带有。
HTML
====

HTML（HyperText Markup Language，超文本标记语言）是一种描述语言，用来定义网页结构。

发展历史
----

1990 年，由于对 Web 未来发展的远见，Tim Berners-Lee 提出了 超文本 的概念，并在第二年在 SGML (en-US) 的基础上将其正式定义为一个标记语言。IETF (en-US) 于 1993 年正式开始制定 HTML 规范，并在经历了几个版本的草案后于 1995 年发布了 HTML 2.0 版本。1994 年，Berners-Lee 为了 Web 发展而成立了 W3C (en-US)。1996 年，W3C 接管了 HTML 的标准化工作，并在 1 年后发布了 HTML 3.2 推荐标准。1999 年，HTML 4.0 发布，并在 2000 年成为 ISO (en-US) 标准。

自那以后，W3C 几乎放弃了 HTML 而转向 XHTML，并于 2004 年成立了另一个独立的小组 WHATWG。幸运的是，WHATWG 后来又转回来参与了 HTML5 标准的制定，两个组织（译注：即 W3C 和 WHATWG）在 2008 年发布了第一份草案，并在 2014 年发布了 HTML5 标准的最终版。

概念和语法
-----

HTML 文档是包含多个 HTML 元素 的文本文档。每个元素都用一对开始和结束 标签 包裹。每个标签以尖括号（`<>`）开始和结束。也有一部分标签中不需要包含文本，这些标签称为空标签，如 `<img>`。

你可以使用 属性 来扩展 HTML 标签。属性用来提供一些附加信息，这些信息可能会影响浏览器对元素的解析：

![Detail of the structure of an HTML element](/zh-CN/docs/Glossary/HTML/anatomy-of-an-html-element.png)

HTML 文件通常会以 `.htm` 或 `.html` 为扩展名。用户可以从 Web 服务器 中下载，并使用任一 Web 浏览器 来解析和显示。

参见
--

* 维基百科 HTML 词条
* HTML 教程
* codecademy.com 上的在线教程
* MDN HTML 文档
* HTML 规范
渐进增强
====

**渐进增强**（Progressive enhancement）是一种设计理念，其核心是为尽可能多的用户提供基本内容和功能，同时进一步为现代化浏览器用户提供最佳体验，运行所有需要的代码。

特性检测通常用于确定浏览器是否可以处理高级内容，而polyfill通常用于使用 JavaScript 构建缺少的功能。

另外请关注无障碍支持 — 尽可能提供备选方案。

这个技术很有用，因为它让 Web 开发者，在专注开发最强大的网站同时，和某些未知的用户代理在访问网站时发生问题，两者之间达到权衡。 优雅降级 相关而不同 — 通常被视为与渐进增强相反的方向。实际上，这两种方法都是有效的，并且通常可以相互补充。

参见
--

* 维基百科的渐进增强
分组密码工作模式
========

分组密码工作模式（Block cipher mode of operation）通常在上下文中称为“模式”，它指定应如何使用分组密码来加密或解密长于块大小的消息。

当前使用的大多数对称密钥算法都是分组密码：这意味着它们一次加密一个块的数据。每个块的大小是固定的，并由算法确定：例如，AES 使用 16 字节的块。分组密码始终与一种模式一起使用，该模式指定了如何安全加密长度超过块大小的消息。例如，AES 是密码，而 CTR、CBC 和 GCM 都是模式。使用不合适的模式或不正确地使用模式会完全破坏基础加密算法提供的安全性。
CSRF
====

跨站请求伪造（CSRF）是一种冒充受信任用户，向服务器发送非预期请求的攻击方式。例如，这些非预期请求可能是通过在跳转链接后的 URL 中加入恶意参数来完成：


```html
<img src="https://www.example.com/index.php?action=delete&id=123" />
```


对于在 `https://www.example.com` 有权限的用户，这个 `<img>` 标签会在他们根本注意不到的情况下对 `https://www.example.com` 执行这个操作，即使这个标签根本不在 `https://www.example.com` 内亦可。

有很多预防 CSRF 的方法，比如实现 RESTful API，增加 secure token 等等。

参见
--

* 跨站请求伪造 on Wikipedia
* 防御方法
ASCII
=====

**ASCII** (*American Standard Code for Information Interchange，美国信息交换标准码*) 是计算机中最常用的编码方式，用于将字母，数字，标点符号和控制字符转换为计算机可以理解的数字形式。从 2007 年开始逐渐被UTF-8 代替。

更多：
---

### 基本知识

ASCII on Wikipedia
IndexedDB
=========

IndexedDB 是一个用于在浏览器中储存较大数据结构的 Web API, 并提供索引功能以实现高性能查找。像其他基于 SQL 的 关系型数据库管理系统 (RDBMS) 一样，IndexedDB 是一个事务型的数据库系统。然而，它是使用 JavaScript 对象而非列数固定的表格来储存数据的。

参见
--

* MDN 页面 IndexedDB API
* The W3C specification for IndexedDB
Parse
=====

Parsing means analyzing and converting a program into an internal format that a runtime environment can actually run, for example the JavaScript engine inside browsers.

Parsing 就是将程序解析以及转换成能够在运行环境中运行的计算机内部格式，浏览器中的JavaScript 驱动就是一个很好的解析例子。

In JavaScript, this is done during compile time or whenever the parser (en-US) is invoked, such as during a call to a method.

JavaScript 中的解析过程一般在compile time中完成，或者是在任意parser (en-US) 参与的时候完成。比如说在调用一个 JS 方法的过程中完成 parsing。

Learn more
----------

### General knowledge

* Parse on Wikipedia
UTF-8
=====

UTF-8 (UCS Transformation Format 8) 是万维网上最常用的字符编码。每个字符由 1 到 4 个字节表示。UTF-8 与 ASCII 向后兼容，可以表示任何标准的 Unicode 字符。

前 128 个 UTF-8 字符与前 128 个 ASCII 字符 (编号为 0-127) 精确匹配，这意味着现有的 ASCII 文本已经是有效的 UTF-8。所有其他字符都使用 2 到 4 个字节。每个字节都有一些用于编码目的的保留位。由于非 ASCII 字符需要一个以上的字节来存储，如果字节被分隔而不重组，那么它们就会有损坏的风险。

参见
--

* UTF-8 on Wikipedia
* FAQ about UTF-8 on Unicode website
IDE
===

集成编程开发环境 (**I**ntegrated **D**evelopment **E**nvironment) 或交互式开发环境，是为程序员提供了软件开发所需的完善工具链的软件应用。一个 IDE 通常包含一个代码编辑器，自动编译工具和一个调试器。

### General knowledge

* IDE on Wikipedia
空值
==

在 JavaScript 中，一个空值（nullish value）要么是 `null`，要么是 `undefined`。空值总是假值。
RSS
===

**RSS**（简易信息聚合）指的是用于发布站点更新的数种 XML 文档格式。当你订阅一个网站的 RSS 摘要时，网站会将 RSS 信息和更新信息发送到一个称为资讯（feed）的 RSS 文档中，因此你无需手动查看所有喜爱的网站就可以获取这些网站的更新动态。

参见
--

* 维基百科上的 RSS
* 最新的 RSS 标准
First paint
===========

**First Paint**，是Paint Timing API的一部分，是页面导航与浏览器将该网页的第一个像素渲染到屏幕上所用的中间时，渲染是任何与输入网页导航前的屏幕上的内容不同的内容。它回答了“发生了什么？”这个问题。

另请参看
----

* First meaningful paint (en-US)
* First contentful paint (en-US)
* Paint Timing API
Native
======

一个*原生*的应用程序在被编译后，可以在由指定结构组成的硬件/软件环境中运行

原生安卓应用的一个例子：在安卓工具链的支持下使用 Java 编写的手机应用

从另一方面来讲，一个在浏览器中运行的网页应用就不是原生——其必须运行在基于原生环境的浏览器中，而不是在原生环境本身。

参见
--

* 维基百科上的 Native (computing)
BigInt
======

在 JavaScript 中，**BigInt** 是一种数字数据类型，它可以表示任意精度格式的整数。而在其他编程语言中，可以存在不同的数字类型，例如：整数、浮点数、双精度浮点数或大整数（Bignum）。

参见
--

* 维基百科上的数字类型
* JavaScript 类型：`BigInt`
* JavaScript 全局对象 `BigInt`
伪代码
===

伪代码（Pseudocode）指的是类似于代码的语法，一般用于向人类表明某些代码语法是如何工作的，或者说明某项代码结构的设计。如果你试图把它当作代码来运行，它**不会**起作用。

参见
--

* 维基百科上的伪代码词条。
码元（Code unit）
=============

**码元**是字符编码系统（例如 UTF-8 或 UTF-16）使用的基本组成部分。字符编码系统将一个 Unicode 码位编码为一个或者多个码元。

在 UTF-16（JavaScript 字符串使用的编码系统）中，码元是 16 位值。这意味着索引到字符串或者获取字符串长度等操作将在这些 16 位单元上进行。这些单元不总是一对一地映射到我们可能认为的字符上。

例如，带有附加符号（例如重音符号）的字符有时会使用两个 Unicode 码位表示：


```js
const myString = "\u006E\u0303";
console.log(myString); // ñ
console.log(myString.length); // 2
```


此外，由于并非 Unicode 定义的所有码位都适合 16 位，因此很多 Unicode 码位都编码为一对 UTF-16 码元，称为*代理对*：


```js
const face = "🥵";
console.log(face.length); // 2
```


JavaScript `String` 对象的 `codePointAt()` 方法可以让你从它的编码形式检索到 Unicode 码位：


```js
const face = "🥵";
console.log(face.codePointAt(0)); // 129397
```

参见
--

* Unicode 编码常见问题
全局对象
====

一个全局对象是一个永远存在于 global scope (en-US) 的 object.

在 JavaScript 中，有一个永远被定义的全局对象。在一个 web 浏览器中，当脚本创建全局变量时，他们作为该全局对象的成员被创建。(在 Node.js 不是这样.) 全局对象的 interface 取决于脚本在其中运行的执行上下文。例如：

* 在 Web 浏览器中，脚本没有专门作为后台任务启动的任何代码都将`Window` 作为其全局对象。这是 Web 上绝大多数的 JavaScript 代码。
* 在 `Worker` 中运行的代码将`WorkerGlobalScope` (en-US) 对象作为其全局对象。
* 在Node.js 环境下运行的脚本具有一个称为`global` 的对象作为其全局对象。
浏览器中的 `window` 对象
-----------------

`window` 对象是浏览器中的全局对象。任何全局变量或者全局函数都可以通过 `window` 的属性来访问。

### 访问全局变量


```js
var foo = "foobar";
foo === window.foo; // Returns: true
```


在定义全局变量 `foo` 之后，我们可以通过 `window` 对象的属性来访问它。把变量名 `foo` 作为全局对象的 `window.foo` 的属性名来使用。

#### 解释：

全局变量 `foo` 存储在 `window` 对象中，像这样：


```js
foo: "foobar";
```

### 访问全局函数


```js
function greeting() {
  console.log("Hi!");
}

window.greeting(); // It is the same as the normal invoking: greeting();
```


上面解释了全局对象如果作为 `window` 对象的属性而存储的。我们创建了全局函数 `greeting` ，然后通过 `window` 对象来调用它。.

#### 解释：

全局函数 `greeting` 存储在 `window` 对象中，像这样：


```js
greeting: function greeting() {
  console.log("Hi!");
}
```

参见
--

* MDN Web Docs Glossary
    + global scope (en-US)
    + object
* `Window`
* `WorkerGlobalScope` (en-US)
* `global`
密码散列函数
======

加密散列函数有时也称为*摘要函数*，其是一种密码学原语，将任意大小的信息转为固定大小的消息，称为摘要。加密散列函数通常用于授权、数字签名以及密钥散列消息认证码。

散列函数必须有以下特征才能用于密码学：

* 快速计算（因为它们需要频繁地生成）
* 不可逆（每个摘要可能来自拥有庞大数据的消息，并且仅有暴力破解才能生成产生给定摘要的消息）
* 防篡改（对消息的任何改变都会产生不同的摘要）
* 抗碰撞（应该不可能找到两个不同的消息产生相同的摘要）

像 MD5 和 SHA-1 这样的加密散列函数被认为是不安全的，因为已经发现了可以显著降低它们抗碰撞性的攻击。

参见
--

* 维基百科上的加密散列函数
* MDN Web 文档术语
    + 对称密钥加密 (en-US)
IPv6
====

**IPv6** 是当前版本的互联网（Internet）通信协议（protocol）。IPv6 正在慢慢地取代 IPv4 (en-US)，因为 IPv6 允许使用更多不同的 IP 地址。

参见
--

* IPv6 on Wikipedia
自执行匿名函数
=======

一个 JavaScript 函数在定义后立即执行。也被熟知为 IIFE（立即调用函数表达式）。

请浏览上面 IIFE 解释页链接获取更多信息。
NaN
===

NaN(不是一个数字) 是一种数值表达形式 data type这意味一种未定义的值或者不能够被描述的值，尤其浮点型结算的结果。

举例，NaNs 能够描述无穷大，数字除 0 的结果，缺少值，或者平方根为负数（这是虚构的，而浮点数是真实的）。

实际上，如果我在JavaScript 程序中划分两个变量，结果可能是 NaN，它在 JavaScript 中被预定义为“undefined”。于是这个除法可能中断程序。现在，如果这个计算是一个大规模算法的一小部分，那么确定错误实际发生的地方真的很困难。幸运的是，由于结果将是 NaN，我知道我的除数可能会变为 0，我可以设置防止任何此类计算的测试条件，或通知我发生的位置。

参见
--

* NaN 在维基百科
* NaN in JavaScript
XQuery
======

**XQuery** 是一门用于更新、检索以及计算 XML 数据库中数据的计算机语言。

参见
--

* 官方网站
* 维基百科上的 XQuery
SDP
===

**SDP** (Session Description Protocol) 是一个描述peer-to-peer (en-US) 连接的标准。SDP 包含音视频的：编解码 (codec),源地址，和时间信息。

下面是一个典型的 SDP 信息示例：
```

v=0
o=alice 2890844526 2890844526 IN IP4 host.anywhere.com
s=
c=IN IP4 host.anywhere.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
m=video 51372 RTP/AVP 31
a=rtpmap:31 H261/90000
m=video 53000 RTP/AVP 32
a=rtpmap:32 MPV/90000
```


SDP 协议从不会被单独使用，而是依靠 RTP (en-US) 和RTSP (en-US)等协议.SDP 也作为WebRTC的组件之一，用于描述一个 session 会话。

参见
--

* WebRTC protocols
* Session Description Protocol on Wikipedia
类型
==

**类型** (*或数据类型*) 是决定 value 可以存为哪个类型的特性 —例如在 JavaScript 中一个 `Boolean` (en-US) 只能存放 `true`或`false` , 而一个 `String` 能存放任何字符串 , 一个 `Number` 存放任何类型的数字 , 等等...

值的数据类型也影响哪个操作对该值有效。例如，一个整数可以乘以一个整数，而不是一个字符串。

参见
--

* 维基百科的 Data type
* JavaScript 的数据类型
散列
==

散列（Hash）函数采用可变长度消息输入并产生固定长度的散列输出。它通常以 128 位“指纹”或“消息摘要”的形式出现。散列函数对密码学非常有用——它们确保传输数据的完整性，这也为提供消息认证的 HMAC 提供了基础。

参见
--

* 维基百科上的散列函数词条
CDN
===

**CDN** (内容分发网络) 指的是一组分布在各个地区的服务器。这些服务器存储着数据的副本，因此服务器可以根据哪些服务器与用户距离最近，来满足数据的请求。CDNs 提供快速服务，较少受高流量影响。

CDNs 被广泛用于传输 stylesheets 和 JavaScript 等静态资源，像 Bootstrap，Jquery 等。对这些库文件使用 CDN 技术，有以下几点好处：

* 通过 CDN 向用户分发传输相关库的静态资源文件，可以降低我们自身服务器的请求压力。
* 大多数 CDN 在全球都有服务器，所以 CDNs 上的服务器在地理位置上可能比你自己的服务器更接近你的用户。地理距离会按比例影响延迟。
* CDNs 已经配置了恰当的缓存设置。使用 CDN 节省了在你的服务器中对静态资源文件的配置。
数字证书
====

数字证书是一个将公开的加密密钥和一个组织绑定的数据文件。一个数字证书包含一个组织的信息，如公共名称（例如 mozilla.org），组织单元（例如 Mozilla Corporation）以及位置（例如 Mountain View）。数字证书通常由certificate authority (en-US)签署，以证明其真实性。

参见
--

* Wikipedia 上的Digital certificate
签名
==

根据上下文，术语 **签名**可以有几个含义。可以参考：

Signature (functions)（函数签名）
一个**函数签名 (**或*类型*签名，或*方法*签名**)** 定义了 Function 或 Method 的输入与输出。
签名（安全）
**签名**或*数字签名*是 protocol，表明消息是真实的。
参见
--

* Signature on Wikipedia
Codec
=====

编解码器（从“coder-decoder”派生的混合词）是对数据流进行编码或解码的程序、算法或设备。给定的编解码器知道如何处理特定的编码或压缩技术。

Learn more
----------

### General knowledge

* Codec on Wikipedia
### Technical reference

* Media formats supported by the HTML audio and video elements
NAT
===

**NAT** (网络地址翻译) 是一个能够让多台主机共享一个 IP 地址的技术。NAT 会给局域网内每台主机分配一个唯一的地址同时调整输入和输出的网络流量，使之能够发送到正确的位置。

参见
--

* WebRTC 协议
* NAT 在 Wikipedia
浏览器扩展
=====

浏览器扩展是一种跨浏览器系统，用于开发 Firefox 的浏览器扩展。这个系统能够提供许多 API，在很大程度上能够被不同的浏览器所支持，例如 Mozilla Firefox，Google Chrome，Opera 浏览器，微软 Edge 和 Apple Safari 浏览器。

参见
--

* MDN 上的 浏览器扩展。
SSL（安全套接层）
==========

**SSL**（Secure Sockets Layer，安全套接层）是旧的标准安全技术，用于在服务器和客户端之间创建加密的网络链路，确保传递的所有数据都是私密且安全的。SSL 的当前版本是 Netscape 于 1996 年发布的 3.0 版本，已被 TLS 协议取代。

参见
--

* 传输层安全性协议（维基百科）
* 传输层安全协议（TLS）
* 术语表
    + HTTPS
    + TLS
缓冲区
===

缓冲区是物理内存中的一个存储区域，当数据进行转移时用来临时存放数据。

参见
--

* 维基百科上的缓冲器词条
万维网
===

*万维网*（World Wide Web）——一般称其为 **WWW**、**W3** 或 **the Web**——是通过互联网访问公共网页的互连系统。Web 与互联网不一样：Web 是建立在互联网之上的许多应用程序之一。

Tim Berners-Lee 提出了被称为万维网的架构。他在 1990 年在 CERN 物理研究实验室的计算机上创建了第一个 web 服务器、web 浏览器和网页。1991 年，他在 alt.hypertext 新闻组上宣布了他的创作，那一刻标志着 Web 的首次公开。

我们今天认为的“Web”系统由几个组件组成：

* **HTTP** 协议，管理服务器和客户端之间的数据传输。
* 要访问 Web 组件，客户端提供唯一的通用标识符，称为 **URL**（统一资源定位符）或 URI（统一资源标识符）（正式称为通用文档标识符（UDI））。
* **HTML**（超文本标记语言）是发布 Web 文档的最常用格式。

通过超链接连接资源是 Web 的定义概念，帮助其身份作为连接文档的集合。

Tim Berners-Lee 在发明 Web 之后不久就创建了 W3C (en-US)（万维网联盟），进一步规范和开发 Web。该联盟由核心 Web 兴趣小组组成，如网页浏览器开发人员、政府机构、研究人员和大学。其使命包括教育和外联。

参见
--

* 学习网络
* 维基百科上的万维网词条
* W3C 网站
Hypertext
=========

Hypertext 包含了指向其他文本的链接，而不是像小说中的单一线性流。

这个术语是由 Ted Nelson 在 1965 年左右提出的。

参见
--

* 维基百科上的Hypertext
ECMA
====

**Ecma International**（正式名称是 *European Computer Manufacturers Association，欧洲计算机制造商协会*）是一个开发计算机硬件、通信和程序语言标准的非盈利组织。

在网络上该组织因维护 JavaScript 语言的核心规范 the ECMA-262 specification（即 ECMAScript）而为人所知。

参见
--

* Wikipedia 页面 Ecma International
* The Ecma International web site
节点
==

术语**节点**（Node）根据不同的上下文，可以是多种不同的意思。它可能是：

节点（DOM）
在 DOM 的上下文中，节点（Node）是节点树中的单个点。包括文档本身、元素、文本以及注释都属于是节点。
节点（网络）
在网络中，**节点**是网络中的一个连接点。在物理网络中，节点通常是一个设备，如计算机或路由器。

这个词的另一个含义，我们将在 Node.js 中讨论。
Three js
========

three.js，一WebGL引擎，基于JavaScript，可直接运行 GPU 驱动游戏与图形驱动应用于浏览器。其库提供大量特性与API以绘制 3D 场景于浏览器。

参见
--

* Three.js维基词条
* three.js 官网
应用层协议协商（ALPN）
=============

**应用层协议协商**（**Application-Layer Protocol Negotiation**，简称 **ALPN**）是由 RFC 7301 定义的一个 TLS 扩展，故而应用层协议在协商加密协议的过程中，避免了额外的往返通讯开销。

| 协议 | 标识符字节序列 |
| --- | --- |
| HTTP/1.1 | `0x68 0x74 0x74 0x70 0x2F 0x31 0x2E 0x31` ("http/1.1") |
| HTTP/2 | `0x68 0x32` ("h2") |
| HTTP/2 over cleartext TCP | `0x68 0x32 0x63` ("h2c") |

参见
--

* IANA 注册的 ALPN 标识符
Truthy（真值）
==========

在 JavaScript 中，**truthy**（真值）指的是在布尔值上下文中，转换后的值为 `true` 的值。被定义为假值以外的任何值都为真值。（即所有除 `false`、`0`、`-0`、`0n`、`""`、`null`、`undefined` 和 `NaN` 以外的皆为真值）。

JavaScript 在布尔值上下文中使用强制类型转换。

JavaScript 中的*真值*示例如下（将被转换为 `true`，因此 `if` 后的代码段将被执行）：


```js
if (true)
if ({})
if ([])
if (42)
if ("0")
if ("false")
if (new Date())
if (-42)
if (12n)
if (3.14)
if (-3.14)
if (Infinity)
if (-Infinity)
```

### 逻辑与运算 &&

如果第一个对象为真值，则逻辑与运算返回第二个操作数。


```js
true && "dog"
// returns "dog"

[] && "dog"
// returns "dog"
```

参见
--

* 假值
* 强制类型转换
* 布尔值
异常
==

**异常**（Exception）是指中断正常代码执行的条件。在 JavaScript 中语法错误是一个非常常见的异常来源。

参见
--

* 维基百科上的异常处理词条
Character encoding（字符编码）
========================

一套编码系统定义字节与文本间的映射。一连串字节文本能让不同文本解释得以进行。我们指明一套特定编码系统时（如 UTF-8），也就指明了字节得以解释的方式。

例如，我们通常在 HTML 里声明 UTF-8 字符编码，使用如下：


```html
<meta charset="utf-8" />
```


这就确保你在 HTML 文档中可以使用几乎任何一种人类语言中的字符，并且会稳定显示。

参见
--

* Character encoding on W3C
* Character encoding on Wikipedia
Ligature
========

“连字”是指将两个字符组合后变为一个形状，像是法语中的“œ”就是“oe”的连字。

你可以在网页中使用 `font-variant-ligatures` 来实现连字

参见
--

* Ligature on Wikipedia
Mozilla Firefox 浏览器
===================

**Mozilla Firefox** 是一个免费的开源浏览器，其开发工作由 Mozilla 公司负责监督。Firefox 可在 Windows、OS X、Linux 和 Android 平台下运行。

Firefox 于 2004 年 11 月首次发布，可通过主题、插件和附加组件完全定制。火狐浏览器使用 Gecko 来渲染网页，并实现了当前和未来的 Web 标准。

参见
--

* Mozilla Firefox 官方网站
* MDN 上的 Firefox 开发者文档
CORS
====

**CORS**（Cross-Origin Resource Sharing，跨源资源共享）是一个系统，它由一系列传输的 HTTP 标头组成，这些 HTTP 标头决定浏览器是否阻止前端 JavaScript 代码获取跨源请求的响应。

同源安全策略默认阻止“跨源”获取资源。但是 CORS 给了 web 服务器这样的权限，即服务器可以选择，允许跨源请求访问到它们的资源。

CORS 标头
-------

`Access-Control-Allow-Origin`

指示响应的资源是否可以被给定的来源共享。

`Access-Control-Allow-Credentials`

指示当请求的凭证标记为 true 时，是否可以公开对该请求响应。

`Access-Control-Allow-Headers`

用在对预检请求的响应中，指示实际的请求中可以使用哪些 HTTP 标头。

`Access-Control-Allow-Methods`

指定对预检请求的响应中，哪些 HTTP 方法允许访问请求的资源。

`Access-Control-Expose-Headers`

通过列出标头的名称，指示哪些标头可以作为响应的一部分公开。

`Access-Control-Max-Age`

指示预检请求的结果能被缓存多久。

`Access-Control-Request-Headers`

用于发起一个预检请求，告知服务器正式请求会使用哪些 HTTP 标头。

`Access-Control-Request-Method`

用于发起一个预检请求，告知服务器正式请求会使用哪一种 HTTP 请求方法。

`Origin`

指示获取资源的请求是从什么源发起的。

参见
--

* 在 MDN 的跨源资源共享（CORS）
* 维基百科上的跨源资源共享
* Fetch 规范
Grid Cell
=========

在Grid 布局中，**网络单元格**是 CSS 网格中的最小单元。它是四条网格线之间的空间，概念上非常像表格单元格。

![Diagram showing an individual cell on the grid.](/zh-CN/docs/Glossary/Grid_Cell/1_grid_cell.png)

如果不使用网格布局提供的方法去放置网格容器的项目，这些项目将通过自动布局算法被放置到每个网格单元格中。将创建额外的行或列轨道以创建足够的单元格来保存所有项目。

在例子中，我们创建了一个三列轨道的网格。五个项目被放置到网格单元格中，它们沿着初始行依次被放置到三个网格单元格中，然后为剩下的两个创建了一个新行。

示例
--
```

\* {
  box-sizing: border-box;
}

.wrapper {
  border: 2px solid #f76707;
  border-radius: 5px;
  background-color: #fff4e6;
}

.wrapper > div {
  border: 2px solid #ffa94d;
  border-radius: 5px;
  background-color: #ffd8a8;
  padding: 1em;
  color: #d9480f;
}
```



```css
.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: 100px;
}
```



```html
<div class="wrapper">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
  <div>Four</div>
  <div>Five</div>
</div>
```

参见
--

### 属性参考

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

* CSS Grid Layout Guide: *Basic concepts of grid layout*
* Definition of Grid Cells in the CSS Grid Layout specification
UDP（用户数据报协议）
============

**UDP**（用户数据报协议）是一个与 IP 协议 一起使用的长期协议，用于在传输速度和效率比安全性和可靠性更重要的场合下发送数据。

UDP 使用一个简单的、具有最小协议机制的无连接通信模型。UDP 使用校验和保证数据完整性，使用端口号以区分数据发送方和接收方中不同的应用程序。它无需握手会话，即将不可靠的底层网络直接暴露给了用户的应用程序：不保证消息交付、不保证交付顺序也不保证消息不重复。如果需要网络接口层面的纠错功能，则应用程序可以使用为此目的设计的传输控制协议（TCP）或者流控制传输协议（SCTP）。

UDP 适用于不需要差错和纠错的应用程序，它的协议栈避免了处理此类问题的开销。对时间敏感的应用程序通常使用 UDP，因为丢弃数据包比等待数据包重传（可能不是实时操作系统可接受的选项）更可取。

参见
--

* 维基百科上的 用户数据报协议
* 规范
Encapsulation
=============

Encapsulation（封装）是指将数据与函数打包到一个组件（例如，类）中，使得外部对于该组件对象的访问如同一个“黑盒子”一样。如此一来，类的使用者只需知道它的接口（即类对外暴露的数据与方法），而无需关心其内部是如何实现的。

参见
--

* 维基百科上的 封装
回调函数
====

被作为实参传入另一函数，并在该外部函数内被调用，用以来完成某些任务的函数，称为回调函数。

例如：


```js
function greeting(name) {
  alert("Hello " + name);
}

function processUserInput(callback) {
  var name = prompt("Please enter your name.");
  callback(name);
}

processUserInput(greeting);
```


以上示例为同步回调，它是立即执行的。

然而需要注意的是，回调函数经常被用于在一个异步操作完成后执行代码，它们被称为异步回调。一个常见的例子是在 promise 末尾添加的 `.then` 内执行回调函数（在 promise 被兑现或拒绝时执行）。这个结构常用于许多现代的 web API，例如 `fetch()`。

参见
--

* 维基百科上的回调函数
Block
=====

术语 **block** 在不同的上下文中有多种含义。这些含义可能是

Block (块作用域)
在 JavaScript中，函数块是指被大括号 ("{}") 包裹住的相关联的statement的集合。例如，你可以在 `Statements/if...else`后声明一段函数块形式的代码，表明当条件判断为真时，解释程序应该运行上述函数块里的代码，或者当条件判断为假时跳过执行上述函数块里的代码。
区块（CSS）
网页上的区块（block）指的是出现在新行上的 HTML element，即在横向书写模式中位于上一个元素之下，下一个元素之上（通常称为块级元素）。例如 HTML 中的 `p` 元素默认为块级元素，而 `a` 元素为*行级元素*——你可以在 HTML 源码中将多个锚点紧靠在一起，而在渲染输出中这些锚点将在同一行内显示。
Unicode
=======

Unicode 是一种字符集标准，用于对来自世界上不同语言、文字系统和符号进行编号和字符定义。通过给每个字符分配一个编号，程序员可以创建字符编码，让计算机在同一个文件或程序中存储、处理和传输任何语言组合。

在 Unicode 定义之前，在同一数据中混合使用不同的语言是很困难的，而且容易出错。例如，一个字符集存储的是日文字符，而另一个字符集存储的是阿拉伯字母。如果没有明确标明数据的哪些部分属于哪个字符集，其他程序和计算机就会错误地显示文本，或者在处理过程中损坏文本。如果你曾经见过像 (`“”`) 被替换为胡言乱语 `Ã‚Â£`，那么你就已经看到过这个被称为 Mojibake 的问题。

网络上最常见的 Unicode 字符编码是UTF-8。还存在一些其他编码，如 UTF-16 或过时的 UCS-2，但推荐使用 UTF-8。

参见
--

* Unicode on Wikipedia
* The Unicode Standard: A Technical Introduction
HTTP
====

HTTP (The HyperText Transfer Protocol，超文本传输协议) 是用于在 Web 上传输超媒体文件的底层 协议 ，最典型场景的是在浏览器和服务器之间传递数据，以供人们浏览。现行的 HTTP 标准的版本是 HTTP/2。

`http://` 称为 `schema`，是 URI 的组成部分，一般位于网络地址的开头。以 `https://developer.mozilla.org` 为例，该地址说明请求文档时使用 HTTP 协议；这里的 https 代指 HTTP 协议的安全版本，即 SSL （或称 TLS）

HTTP 是基于文本的 (所有的通信都以纯文本的形式进行) 以及无状态的 (当前通信状态不会发现以前的通信状态)，该特性极大方便了在 www 上浏览网页的人。除此之外，HTTP 也可以用于构建服务器之间交互的 REST web 服务，以及使得网站内容更加动态化的 AJAX 请求。

补充知识
----

* 在 MDN 上的 HTTP
* 在维基百科上的 HTTP
Endianness（字节序）
===============

字节序，或字节顺序（"Endian"、"endianness" 或 "byte-order"），描述了计算机如何组织字节，组成对应的数字。

每个内存存储位置都有一个索引或地址。每一 字节可以存储一个 8 位数字（即介于 `0x00` 和 `0xff` 之间），因此，你必须保留不止一个字节来储存一个更大的数字。现在，大部分需占用多个字节的数字排序方式是 **little-endian**（译者注：可称小字节序、低字节序，即低位字节排放在内存的低地址端，高位字节排放在内存的高地址端。与之对应的 big-endian 排列方式相反，可称大字节序、高字节序），所有的英特尔处理器都使用 little-endian。little-endian 的意思是使用低位储存更重要的信息，least-to-most-significant（最不重要的（least significant）字节取第一个位置，或者说地址最低的位置），可类比欧洲通用的日期书写方式（例如，31 December 2050。译者注：年份是最重要的，月份其次，日期最后）。

自然，**big-endian** 是相反的顺序，可类比 ISO 日期格式（例如 2050-12-31）。big-endian 通常被称作"网络字节顺序"（"network byte order"）, 因为互联网标准通常要求数据使用 big-endian 存储，从标准 Unix 套接字（socket）层开始，一直到标准化网络的二进制数据结构。此外，老式 Mac 计算机的 68000 系列 和 PowerPC（译者注：IBM 与 Apple 公司联合生产的个人台式机）微处理器曾使用 big-endian。

举个例子，用不同字节序存储数字 `0x12345678`（即十进制中的 305 419 896）：

* *little-endian*：`0x78 0x56 0x34 0x12`
* *big-endian*：`0x12 0x34 0x56 0x78`
* *mixed-endian*（文物，非常罕见）：`0x34 0x12 0x78 0x56`
参见
--

* `ArrayBuffer`
* `DataView`
* Typed Arrays
* Wikipedia 上的 Endianness
* Data structure
网格轴
===

CSS 网格布局是一种二维布局方法，能够按*行*和*列*对内容布局。因此在任何网格中都有两个轴——*块向或列轴*（block or column axis），及*行向或行轴*（inline or row axis）。

沿着这些轴可以使用盒对齐规范中定义的属性对元素按块向轴或行向轴对齐。

在 CSS 中，*块向或列轴*用于对文本区块布局。如果你有两个段落，用的从右到左、从上到下的语言，那么在块向轴上两个段落一个排在另一个下面。

![CSS 网格布局中的块向轴图示](/zh-CN/docs/Glossary/Grid_Axis/7_block_axis.png)

*行向或行轴*沿与块向轴垂直的方向延伸，常规文本沿其方向流动。以下是我们在网格布局中的行。

![CSS 网格布局中的行向轴图示](/zh-CN/docs/Glossary/Grid_Axis/7_inline_axis.png)

这些轴的实体方向可根据文档的书写模式改变。

参见
--

* CSS 网格布局指南：*网格布局的基本概念*
* CSS 网格布局指南：*网格布局中的盒对齐*
* CSS 网格布局指南：*网格、逻辑值和书写模式*
异步
==

**异步**（asynchronous）指两个或两个以上的对象或事件**不**同时存在或发生（或多个相关事物的发生无需等待其前一事物的完成）。在计算机技术中，"异步"一词被用于两大语境。

网络与通信
-----

异步通信是一种在双方或多方之间交换消息的方式。其中每个参与方各自在他们方便或可操作的情况下接收并处理消息，而不是在收到消息后立即进行处理。另外，消息的发送无需等待确认信息，前提是如果出现问题，接收方将请求更正或以其他方式处理该情况。

对人类来说，电子邮件就是一种异步通信方式；发送者发送了一封邮件，接着接收者会在方便时读取和回复该邮件，而不是马上这样做。双方可以继续随时发送和接收信息，而无需双方安排何时进行操作。

在异步软件中，发出请求（例如向服务器），并在等待响应时不会阻塞其他进程。该软件可以继续执行其他任务。例如，在基于 Promise 的 API中，会为长时间的操作创建 `Promise` 对象。在操作完成后，promise 会被处理。有了 promise，软件不必等待操作的完成。

软件设计
----

异步软件设计通过构建代码扩展了异步的概念，按照这种设计编写的代码使得程序能够要求一个任务与先前的一个（或多个）任务一起执行，而无需为了等待它们完成而停止执行。当后来的任务完成时，程序将使用约定好的机制通知先前的任务，以便让它知道任务已经完成，以及如果有结果存在的话，这个结果是可用的。

还有许多用来实现异步软件的编程技术。查看文章异步 JavaScript 来了解它们吧。

参见
--

* 从服务器获取数据(Learning Area)（学习区）
* 同步
主轴
==

弹性盒的主轴（main axis）由 `flex-direction` 属性设置的方向所定义。`flex-direction` 有四个取值，分别是：

* `row`
* `row-reverse`
* `column`
* `column-reverse`

假如选择 `row` 或者 `row-reverse`，那么主轴会沿行向延伸。

![此图中 flex-direction 为 row，由此构成主轴](/zh-CN/docs/Glossary/Main_Axis/basics1.png)

选择 `column` 或者 `column-reverse`，那么主轴会沿块向从页面上侧延伸到下侧。

![三个弹性元素占据了容器的全部宽度，按代码顺序依次从上到下显示。flex-direction 设置为 column。主轴为纵向的，即从上到下。](/zh-CN/docs/Glossary/Main_Axis/basics2.png)

元素的 `flex` 属性可将主轴上的任何可用空间加入元素自身，由此可在主轴上控制弹性元素的尺寸。或者你可以用 `justify-content` 属性控制元素之间和周围的空间。

参见
--

### 属性参考

* `flex-basis`
* `flex-direction`
* `flex-grow`
* `flex-shrink`
* `justify-content`
* `flex`
### 拓展阅读

* CSS 弹性盒指南：*弹性盒的基本概念*
* CSS 弹性盒指南：*在弹性容器中对齐元素*
* CSS 弹性盒指南：*控制弹性元素在主轴上的占比*
加密
==

在密码学（cryptography）领域，**加密**是指把明文（plaintext）转换成密文（ciphertext）的过程。密文应该对非授权用户不可读。

加密是一个密码学原语：它通过一种称作 cipher 的编码技术，把纯文本信息转换为密文。现代密码的加密算法是通过特定的密码算法来工作的，称为密钥。由于算法常常是公开的，若要保证加密安全，就必须确保密钥高度保密。

![How encryption works.](/zh-CN/docs/Glossary/Encryption/encryption.png)

如果不知道密钥，其逆过程解密在数学上是很难做到的。究竟有多难做到，取决于算法的安全性，以及密码分析学 (en-US)的发展程度。
ISP
===

互联网服务供应商（Internet Service Provider，简称 ISP）通过电话线上的拨号连接（这在以前比较常见），或宽带连接（如电缆调制解调器或 DSL 服务）出售互联网接入服务，有时也会提供其他服务，如电子邮件、虚拟主机和 IP 语音。

参见
--

* 互联网是如何工作的（给初学者的说明）
* 互联网服务供应商（中文维基百科）
DNS
===

DNS（Domain Name System）域名系统，是一个层次化、分散化的互联网连接资源命名系统。DNS 维护着一个域名列表以及与之相关联的资源（例如 IP 地址）。

DNS 最突出的功能是将易于记忆的域名（例如 mozilla.org）翻译成为数字化的 IP 地址（例如 151.106.5.172）；这一从域名到 IP 地址的映射过程被称为**DNS 查询**（DNS lookup）。与之对应，**DNS 反向查询**（rDNS）用来找到与 IP 地址对应的域名。

参见
--

* 理解域名
* 维基百科上的域名系统