diff --git a/src/.vitepress/config.mts b/src/.vitepress/config.mts index a318e4d..4c7ae32 100644 --- a/src/.vitepress/config.mts +++ b/src/.vitepress/config.mts @@ -20,7 +20,6 @@ export default defineConfig( { text: 'Home', link: '/' }, { text: 'JavaScript', link: '/javascript/index' }, { text: 'NodeJS', link: '/nodejs/index' }, - { text: 'Examples', link: '/markdown-examples' }, { text: '参考', link: '/reference' } ], @@ -30,15 +29,9 @@ export default defineConfig( { text: 'EventEmitter', link: '/nodejs/event-emitter' - } - ], - '/markdown-examples': [ - { - text: 'Examples', - items: [ - { text: 'Markdown Examples', link: '/markdown-examples' }, - { text: 'Runtime API Examples', link: '/api-examples' } - ] + }, { + text: 'File System', + link: '/nodejs/file-system' } ] }, diff --git a/src/api-examples.md b/src/api-examples.md deleted file mode 100644 index 6bd8bb5..0000000 --- a/src/api-examples.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -outline: deep ---- - -# Runtime API Examples - -This page demonstrates usage of some of the runtime APIs provided by VitePress. - -The main `useData()` API can be used to access site, theme, and page data for the current page. It works in both `.md` and `.vue` files: - -```md - - -## Results - -### Theme Data -
{{ theme }}
- -### Page Data -
{{ page }}
- -### Page Frontmatter -
{{ frontmatter }}
-``` - - - -## Results - -### Theme Data -
{{ theme }}
- -### Page Data -
{{ page }}
- -### Page Frontmatter -
{{ frontmatter }}
- -## More - -Check out the documentation for the [full list of runtime APIs](https://vitepress.dev/reference/runtime-api#usedata). diff --git a/src/index.md b/src/index.md index eaca02a..16f1fe1 100644 --- a/src/index.md +++ b/src/index.md @@ -30,4 +30,5 @@ import MarkMap from './MarkMap.vue'; - history - [NodeJS](nodejs/index) - [EventEmitter](nodejs/event-emitter) + - [File System](nodejs/file-system) "/> diff --git a/src/javascript/ecma-script/collection-reference/map.md b/src/javascript/ecma-script/collection-reference/map.md index 94419f3..9e16a1f 100644 --- a/src/javascript/ecma-script/collection-reference/map.md +++ b/src/javascript/ecma-script/collection-reference/map.md @@ -33,8 +33,7 @@ m.delete("key1"); m.clear(); ``` :::tip -- 与Object只能使用数值、字符串或符号作为键不同,Map可以使用任何JavaScript数据类型作为键。 -- 与Object类似的是,Map映射的值是没有限制的。 +- Map可以使用任何JavaScript数据类型作为键,并且Map映射的值也是没有限制的。 - Map内部使用SameValueZero(基本相当于使用严格相等)来检查键的匹配性。 ::: @@ -55,7 +54,7 @@ for (const pair of m.entries()) { // 直接使用扩展操作符 const result = [...m]; -m.forEach((key: string, val: string) => { +m.forEach((val: string, key: string) => { console.log(`${key} -> ${val}`) }); @@ -71,7 +70,7 @@ for (const val of m.values()) { ``` ## Object vs Map -- 内存占用:Map大约比Object多存储50%的键值对。 +- 内存占用:对于相同数量的键值对,Map大约比Object多存储50%的键值对。 - 插入性能:如果涉及大量插入操作,Map性能更佳。 - 查找速度:如果涉及大量查找操作,某些情况下(例如使用连续整数作为属性)Object更好。 - 删除性能:如果涉及大量删除操作,毫无疑问应该选择Map。 \ No newline at end of file diff --git a/src/javascript/ecma-script/collection-reference/set.md b/src/javascript/ecma-script/collection-reference/set.md index b5fdecd..dad7ddc 100644 --- a/src/javascript/ecma-script/collection-reference/set.md +++ b/src/javascript/ecma-script/collection-reference/set.md @@ -1 +1,179 @@ -# Set \ No newline at end of file +# Set + +## Set 集合 +Set是ES6新增的集合类型,它类似于数组,但是成员的值都是唯一的,没有重复的值。 + +## 基本用法 + +```js +// 创建空集合 +const s = new Set(); + +// 使用嵌套数组初始化 +const s1 = new Set(["val1", "val2", "val3"]); + +// 添加值 +s.add("val1"); + +// 根据key判断指定元素是否存在 +s.has("val1"); + +// 获取值的数量 +s.size; + +// 删除指定元素,并返回一个布尔值表示是否存在要删除的值 +s.delete("val1"); + +// 清空所有元素 +s.clear(); +``` +:::tip +- Set可以使用任何JavaScript数据类型作为键。 +- Set内部使用SameValueZero(基本相当于使用严格相等)来检查值的匹配性。 +::: + +## 迭代集合 + +```js +const s = new Set(["val1", "val2", "val3"]); + +// 通过entries()方法获取默认迭代器,它会返回一个[value, value]形式的数组 +for (const pair of s.entries()) { + console.log(pair); +} + +// 直接使用扩展操作符 +const result = [...s]; + +// 使用forEach进行迭代 +s.forEach((val: string) => { + console.log(`${val}`) +}); + +// 通过values()方法获取以插入顺序生成值的迭代器 +for (const val of s.values()) { + console.log(val); +} +``` + +## 集合的标准化操作 +通过扩展Set类来添加一些集合的标准化操作:并集、交集、差集、对称差集、笛卡尔积和幂集。 +### 定义 +```js +class XSet extends Set { + union(...sets: Array>): XSet { + return XSet.union(this, ...sets); + } + + intersection(...sets: Array>): XSet { + return XSet.intersection(this, ...sets); + } + + difference(set: Set): XSet { + return XSet.difference(this, set); + } + + symmetricDifference(set: Set): XSet { + return XSet.symmetricDifference(this, set); + } + + cartesianProduct(set: Set): XSet<[T, U]> { + return XSet.cartesianProduct(this, set); + } + + powerSet(): XSet> { + return XSet.powerSet(this); + } + + //返回两个或更多集合的并集 + static union(a: Set, ...bSets: Array>): XSet { + const unionSet = new XSet(a); + for (const b of bSets) { + for (const bValue of b) { + unionSet.add(bValue); + } + } + return unionSet; + } + + //返回两个或更多集合的交集 + static intersection(a: Set, ...bSets: Array>): XSet { + const intersectionSet = new XSet(a); + for (const aValue of intersectionSet) { + if (bSets.every(b => !b.has(aValue))) { + intersectionSet.delete(aValue); + } + } + return intersectionSet; + } + + //返回两个集合的差集 + static difference(a: Set, b: Set): XSet { + const differenceSet = new XSet(a); + for (const bValue of b) { + if (a.has(bValue)) { + differenceSet.delete(bValue); + } + } + return differenceSet; + } + + //返回两个集合的对称差集 + static symmetricDifference(a: Set, b: Set): XSet { + return XSet.union(a, b).difference(XSet.intersection(a, b)); + } + + //返回两个集合(数组对形式)的笛卡儿积 + static cartesianProduct(a: Set, b: Set): XSet<[T, U]> { + const cartesianProductSet = new XSet<[T, U]>(); + for (const aValue of a) { + for (const bValue of b) { + cartesianProductSet.add([aValue, bValue]); + } + } + return cartesianProductSet; + } + + //返回一个集合的幂集 + static powerSet(a: Set): XSet> { + const powerSet = new XSet>().add(new XSet()); + for (const aValue of a) { + for (const set of new XSet>(powerSet)) { + powerSet.add(new XSet(set).add(aValue)); + } + } + return powerSet; + } +} +``` + +### 用法 +```js +const setA = new XSet([1, 2, 3]); +const setB = new XSet([3, 4, 5]); + + +// 并集:返回一个包含两个集合所有元素的新集合,重复的元素只会出现一次 +const unionSet = setA.union(setB); +console.log(unionSet); // 输出:Set (5) {1, 2, 3, 4, 5} + +// 交集:返回一个新集合,包含两个集合中共有的元素 +const intersectionSet = setA.intersection(setB); +console.log(intersectionSet); // 输出:Set (1) {3} + +// 差集:返回一个新集合,包含存在于第一个集合但不在第二个集合中的元素 +const differenceSet = setA.difference(setB); +console.log(differenceSet); // 输出:Set (2) {1, 2} + +// 对称差集:返回一个新集合,包含只存在于其中一个集合中的元素 +const symmetricDifferenceSet = setA.symmetricDifference(setB); +console.log(symmetricDifferenceSet); // 输出:Set (4) {1, 2, 4, 5} + +// 笛卡尔积:返回一个新集合,包含所有可能的有序对组合 +const cartesianProductSet = setA.cartesianProduct(setB); +console.log(cartesianProductSet); // 输出:Set (9) {[1, 3], [1, 4], [1, 5], [2, 3], [2, 4], [2, 5], [3, 3], [3, 4], [3, 5]} + +// 幂集:返回一个新集合,包含原始集合的所有可能子集 +const powerSet = setA.powerSet(); +console.log(powerSet); // 输出:Set (8) {Set (0) {}, Set (1) {1}, Set (1) {2}, Set (2) {1, 2}, Set (1) {3}, Set (2) {1, 3}, Set (2) {2, 3}, Set (3) {1, 2, 3}} +``` \ No newline at end of file diff --git a/src/markdown-examples.md b/src/markdown-examples.md deleted file mode 100644 index f9258a5..0000000 --- a/src/markdown-examples.md +++ /dev/null @@ -1,85 +0,0 @@ -# Markdown Extension Examples - -This page demonstrates some of the built-in markdown extensions provided by VitePress. - -## Syntax Highlighting - -VitePress provides Syntax Highlighting powered by [Shiki](https://github.com/shikijs/shiki), with additional features like line-highlighting: - -**Input** - -````md -```js{4} -export default { - data () { - return { - msg: 'Highlighted!' - } - } -} -``` -```` - -**Output** - -```js{4} -export default { - data () { - return { - msg: 'Highlighted!' - } - } -} -``` - -## Custom Containers - -**Input** - -```md -::: info -This is an info box. -::: - -::: tip -This is a tip. -::: - -::: warning -This is a warning. -::: - -::: danger -This is a dangerous warning. -::: - -::: details -This is a details block. -::: -``` - -**Output** - -::: info -This is an info box. -::: - -::: tip -This is a tip. -::: - -::: warning -This is a warning. -::: - -::: danger -This is a dangerous warning. -::: - -::: details -This is a details block. -::: - -## More - -Check out the documentation for the [full list of markdown extensions](https://vitepress.dev/guide/markdown). diff --git a/src/nodejs/event-emitter.md b/src/nodejs/event-emitter.md index ad7bff5..5c91b9e 100644 --- a/src/nodejs/event-emitter.md +++ b/src/nodejs/event-emitter.md @@ -171,4 +171,7 @@ class EventEmitter { return this.listeners[eventName]; } } -``` \ No newline at end of file +``` + +## API 文档参考 +- [Node.js Events Documentation](https://nodejs.org/docs/latest/api/events.html) \ No newline at end of file diff --git a/src/nodejs/file-system.md b/src/nodejs/file-system.md new file mode 100644 index 0000000..315cb53 --- /dev/null +++ b/src/nodejs/file-system.md @@ -0,0 +1,59 @@ +# File System + +## 编写方式 + +### Synchronous +同步API会阻塞事件循环,直到操作完成或失败。 + +通常用于启动阶段加载配置,或者在不影响主应用流程的特定场景中使用。 +```js +import { readFileSync } from 'node:fs'; + +const result = readFileSync('data.txt'); +console.log(result); +``` + +### Callback +回调可以避免阻塞事件循环,但是可能会导致回调地狱。 +```js +import { readFile } from 'node:fs'; + +readFile('data.txt', (err, data) => { + if (err) console.error(err); + + console.log(data); +}); +``` + +### Promise +Promise可以避免阻塞事件循环同时避免回调地狱。可以写出近乎同步的代码风格,提升可读性。 +```js +import { readFile } from 'node:fs/promises'; + +(async () => { + const result = await readFile('data.txt'); + console.log(result); +})(); +``` + +## 文件系统标志 + +| 标志 | 描述 | +| ------- | ------------------------------------------------------------------ | +| `'a'` | 打开文件用于追加。如果文件不存在,则创建该文件。 | +| `'ax'` | 与`'a'`相似,但如果路径存在,则失败。 | +| `'a+'` | 打开文件用于读取和追加。如果文件不存在,则创建该文件。 | +| `'ax+'` | 与`'a+'`相似,但如果路径存在,则失败。 | +| `'as'` | 打开文件以在同步模式下追加。 如果文件不存在,则创建该文件。 | +| `'as+'` | 打开文件以在同步模式下读取和追加。 如果文件不存在,则创建该文件。 | +| `'r'` | 打开文件用于读取。如果文件不存在,则发生异常。 | +| `'rs'` | 打开文件以在同步模式下读取。 如果文件不存在,则会发生异常。 | +| `'r+'` | 打开文件用于读写。如果文件不存在,则发生异常。 | +| `'rs+'` | 打开文件以同步模式进行读写。用于跳过本地文件系统缓存。 | +| `'w'` | 打开文件用于写入。文件被创建(如果它不存在)或截断(如果它存在)。 | +| `'wx'` | 与`'w'`相似,但如果路径存在,则失败。 | +| `'w+'` | 打开文件用于读写。文件被创建(如果它不存在)或截断(如果它存在)。 | +| `'wx+'` | 与`'w+'`相似,但如果路径存在,则失败。 | + +## API 文档参考 +- [Node.js File System Documentation](https://nodejs.org/docs/latest/api/fs.html) \ No newline at end of file