介绍了 JavaScript 中 new 操作符的工作原理及其四个步骤,并通过 myNew 方法模拟实现 new 的功能。示例展示了构造函数返回普通对象或自定义对象时的不同行为,帮助理解 new 的内部机制及其应用场景。
介绍了浏览器缓存机制的两种方式:强缓存和协商缓存。强缓存通过 Expires 和 Cache-Control 实现,本地直接读取资源;协商缓存通过 Last-Modified / If-Modified-Since 和 Etag / If-None-Match 判断是否更新,命中时返回 304 状态码以减少资源加载。
介绍了函数柯里化的概念及其实现方法,通过递归调用将函数参数逐步累积,直至满足条件后执行。示例展示了柯里化在求和函数中的应用,通过重写 toString 方法实现链式调用并返回结果。
介绍了 JavaScript 中 bind() 函数的原理及其实现,bind() 会创建一个绑定函数,固定 this 值和部分参数。绑定函数通过内部属性 [[BoundTargetFunction]] 和 [[Call]] 实现调用逻辑,并支持 new 运算符构造。示例提供了 bind() 方法的手动实现。
描述了在 VSCode 中加载多个项目时 `.eslintignore` 文件未生效的问题,并通过配置 `eslint.workingDirectories` 解决。推荐使用模式 4,通过正则匹配指定工作目录,适用于 monorepo 项目结构,有效解决了文件忽略问题。
介绍了搜索推荐的实现方式,包括模糊匹配、相似性计算和纠错等。通过动态规划算法解决模糊匹配问题,结合最长公共子串和最长公共子序列方法计算字符串相似性,提供了相关代码示例和应用场景,如 git diff 的实现基础。
模拟环境
// 如何判断原型链上重复的属性
// 模拟一个原型链 Baz => Bar => Foo => FooProto => Object => null
const FooProto = {
ak: 1
}
const Foo = Object.create(FooProto)
Foo.ak = 2
Foo.aj = 4
const Bar = Object.create(Foo)
Bar.ak = 3
Bar.aj = 5
Bar.am = 7
const Baz = Object.create(Bar)
"如何判断原型链上重复的属性?"继续阅读
介绍了 var、let 和 const 在 JavaScript 中的作用域和行为差异。var 声明的变量会提升并挂载到 window 对象上,而 let 和 const 声明的变量存在暂时性死区 (TDZ),在声明代码执行前无法访问,否则会抛出引用错误。
介绍了通过组合设备参数生成用户唯一标识的方法,并使用 fingerprintjs2 库实现匿名指纹获取。代码示例展示了如何利用 requestIdleCallback 在浏览器空闲时生成指纹,同时提供了相关参考和安装指南。
介绍了 X-Real-IP 和 X-Forwarded-For 的用途及区别,X-Forwarded-For 更标准化,用于记录客户端及代理 IP 地址链。通过 Nginx 配置或 Koa 获取客户端真实 IP 的方法示例也被详细说明,推荐优先使用 X-Forwarded-For。