# JavaScript / TypeScript 问题

URL: https://caijiao.org/how-to/javascript/
Source: docs/how-to/javascript/index.md
Description: JavaScript 与 TypeScript 高频问题库，覆盖 JSON、DOM、Fetch、异步、日期、Vite、Node.js 等开发场景。

这里集中解决 JavaScript 和 TypeScript 开发中最常见的具体问题，每页都给出快速答案、最小示例和相关工具链接。

## URL、JSON 与数据处理

- [JavaScript 如何获取 URL 参数](/how-to/javascript/get-url-params)
- [JavaScript 如何复制文本到剪贴板](/how-to/javascript/copy-text-to-clipboard)
- [JavaScript 如何把 JSON 转 CSV](/how-to/javascript/json-to-csv)
- [JavaScript 如何把 CSV 转 JSON](/how-to/javascript/csv-to-json)
- [JavaScript 如何安全解析 JSON](/how-to/javascript/parse-json-safely)
- [JavaScript 如何格式化 JSON 字符串](/how-to/javascript/format-json)
- [JavaScript 如何判断 JSON 是否合法](/how-to/javascript/check-json-valid)
- [JavaScript 如何深拷贝对象](/how-to/javascript/deep-clone-object)
- [JavaScript 数组如何去重](/how-to/javascript/remove-duplicates-array)
- [JavaScript 如何按字段分组数组](/how-to/javascript/group-array-by-key)
- [JavaScript 如何按日期排序数组](/how-to/javascript/sort-array-by-date)
- [JavaScript 如何实现 debounce 防抖](/how-to/javascript/debounce-function)
- [JavaScript 如何实现 throttle 节流](/how-to/javascript/throttle-function)
- [Fetch 如何发送 JSON POST 请求](/how-to/javascript/fetch-json-post)
- [Fetch 如何设置超时时间](/how-to/javascript/fetch-timeout)
- [Fetch 如何处理 HTTP 错误](/how-to/javascript/handle-fetch-error)
- [Fetch 如何上传文件](/how-to/javascript/upload-file-fetch)
- [JavaScript 如何触发文件下载](/how-to/javascript/download-file-js)
- [浏览器 JavaScript 如何读取本地文件](/how-to/javascript/read-file-browser)
- [localStorage 如何设置过期时间](/how-to/javascript/localstorage-expire)

## DOM、浏览器与请求

- [localStorage 和 sessionStorage 有什么区别](/how-to/javascript/sessionstorage-vs-localstorage)
- [JavaScript 如何设置读取和删除 Cookie](/how-to/javascript/cookie-set-read-delete)
- [JavaScript 如何格式化日期为 YYYY-MM-DD](/how-to/javascript/date-format-yyyy-mm-dd)
- [JavaScript 时间戳如何转日期](/how-to/javascript/timestamp-to-date)
- [JavaScript 日期如何转时间戳](/how-to/javascript/date-to-timestamp)
- [JavaScript 如何用正则提取邮箱](/how-to/javascript/regex-extract-email)
- [JavaScript 如何替换字符串中的所有内容](/how-to/javascript/replace-all-string)
- [JavaScript 如何转义 HTML](/how-to/javascript/escape-html)
- [querySelector 动态 ID 报错怎么办](/how-to/javascript/query-selector-dynamic-id)
- [JavaScript 如何做事件委托](/how-to/javascript/event-delegation)
- [JavaScript 如何等待 DOM 加载完成](/how-to/javascript/dom-ready)
- [JavaScript 如何添加删除切换 class](/how-to/javascript/add-class-toggle)
- [JavaScript 如何实现图片懒加载](/how-to/javascript/intersection-observer-lazyload)
- [Promise.all 和 Promise.allSettled 怎么选](/how-to/javascript/promise-all-vs-allsettled)
- [async/await 如何统一捕获错误](/how-to/javascript/async-await-try-catch)
- [JavaScript 如何给异步请求加重试](/how-to/javascript/retry-async-function)
- [ES Module 如何导入和导出函数](/how-to/javascript/module-import-export)
- [JavaScript 如何按需加载模块](/how-to/javascript/dynamic-import)
- [TypeScript type 和 interface 怎么选](/how-to/javascript/typescript-type-vs-interface)
- [TypeScript 可选链怎么用](/how-to/javascript/typescript-optional-chaining)

## 异步、模块与 Node.js

- [TypeScript Record 怎么用](/how-to/javascript/typescript-record)
- [TypeScript unknown 和 any 有什么区别](/how-to/javascript/typescript-unknown-vs-any)
- [TypeScript 如何做类型收窄](/how-to/javascript/typescript-narrowing)
- [TypeScript 如何给 fetch 返回值加类型](/how-to/javascript/typescript-fetch-json-type)
- [TypeScript filter 后如何去掉 null 类型](/how-to/javascript/typescript-array-filter-null)
- [TypeScript Object.keys 为什么丢类型](/how-to/javascript/typescript-object-keys)
- [Vite 如何读取环境变量](/how-to/javascript/vite-env-vars)
- [Vite 部署到子目录资源 404 怎么办](/how-to/javascript/vite-base-path)
- [npm script 如何设置环境变量](/how-to/javascript/npm-run-script-env)
- [Node.js 如何读取 JSON 文件](/how-to/javascript/node-read-json-file)
- [Node.js 路径拼接为什么要用 path.join](/how-to/javascript/node-path-join)
- [Node.js 如何写入文本文件](/how-to/javascript/node-write-file)
- [Node.js 如何读取目录文件列表](/how-to/javascript/node-list-directory)
- [Node.js 如何判断文件是否存在](/how-to/javascript/node-check-file-exists)
- [Node.js 如何读取环境变量](/how-to/javascript/node-env-vars)
- [Node.js 如何读取命令行参数](/how-to/javascript/node-cli-args)
- [ESM 中如何获取当前文件目录](/how-to/javascript/node-current-dir-esm)
- [Node.js 如何执行命令行命令](/how-to/javascript/node-run-command)
- [Node.js 如何逐行读取大文件](/how-to/javascript/node-readline)
- [Node.js 如何快速创建 HTTP 服务](/how-to/javascript/node-http-server)

## TypeScript 类型问题

- [Node.js 如何使用 fetch 请求接口](/how-to/javascript/node-fetch-api)
- [JavaScript 数组如何求和](/how-to/javascript/array-sum)
- [JavaScript 如何求数组最大值和最小值](/how-to/javascript/array-max-min)
- [JavaScript 多维数组如何拍平](/how-to/javascript/array-flatten)
- [JavaScript 如何把对象转成查询字符串](/how-to/javascript/object-to-query-string)
- [JavaScript 如何把查询字符串转对象](/how-to/javascript/query-string-to-object)
- [JavaScript 如何合并对象](/how-to/javascript/merge-objects)
- [JavaScript 如何从对象中只保留部分字段](/how-to/javascript/pick-object-keys)
- [JavaScript 如何删除对象中的某些字段](/how-to/javascript/omit-object-keys)
- [JavaScript 如何给空值设置默认值](/how-to/javascript/optional-default-value)
- [JavaScript 如何格式化数字](/how-to/javascript/number-format)
- [JavaScript 如何格式化人民币金额](/how-to/javascript/currency-format)
- [JavaScript 如何格式化百分比](/how-to/javascript/percent-format)
- [JavaScript 如何生成指定范围随机整数](/how-to/javascript/random-int)
- [浏览器如何生成 UUID](/how-to/javascript/uuid-browser)
- [浏览器 JavaScript 如何计算字符串哈希](/how-to/javascript/hash-string-browser)
- [JavaScript 如何进行 Base64 编码和解码](/how-to/javascript/base64-encode-decode)
- [JavaScript 如何进行 URL 编码和解码](/how-to/javascript/url-encode-decode)
- [JavaScript 如何读取剪贴板文本](/how-to/javascript/clipboard-read)
- [JavaScript 如何判断移动端](/how-to/javascript/detect-mobile)

## Vite、Node 与常用技巧

- [JavaScript 如何监听媒体查询变化](/how-to/javascript/media-query-js)
- [JavaScript 如何检测系统深色模式](/how-to/javascript/prefers-color-scheme)
- [JavaScript 如何监听元素尺寸变化](/how-to/javascript/resize-observer)
- [JavaScript 如何监听 DOM 变化](/how-to/javascript/mutation-observer)
- [JavaScript 如何派发自定义事件](/how-to/javascript/custom-event)
- [JavaScript 如何把 FormData 转对象](/how-to/javascript/formdata-to-object)
- [JavaScript 如何校验邮箱格式](/how-to/javascript/validate-email)
- [JavaScript 如何滚动到指定元素](/how-to/javascript/scroll-to-element)
- [JavaScript 如何判断元素是否可见](/how-to/javascript/detect-element-visible)
- [TypeScript Partial 怎么用](/how-to/javascript/typescript-partial)
- [TypeScript Pick 和 Omit 怎么用](/how-to/javascript/typescript-pick-omit)
- [TypeScript 泛型函数怎么写](/how-to/javascript/typescript-generic-function)
- [TypeScript keyof 怎么用](/how-to/javascript/typescript-keyof)
- [TypeScript as const 有什么用](/how-to/javascript/typescript-as-const)
- [TypeScript satisfies 怎么用](/how-to/javascript/typescript-satisfies)
- [TypeScript never 类型什么时候出现](/how-to/javascript/typescript-never)
- [TypeScript enum 和联合类型怎么选](/how-to/javascript/typescript-enum-vs-union)
- [TypeScript 如何校验接口返回数据](/how-to/javascript/typescript-zod-validate)
- [Vite 开发环境如何代理 API](/how-to/javascript/vite-proxy-api)
- [Vite build 如何区分环境](/how-to/javascript/vite-build-env)
