Nash

Thoughts, stories and ideas.

深入理解 ES6+ 新特性

ECMAScript 6 (简称 ES6) 是 JavaScript 语言的一个重大更新,加入了许多新特性,这些特性极大地提高了开发效率、代码可读性和功能表达能力。本文将围绕以下几个核心特性展开:箭头函数、解构赋值、模块化、Set 和 Map、WeakSet 和 WeakMap,以及其他重要的 ES6 特性。 一、箭头函数 (Arrow Functions)箭头函数是一种更简洁的函数书写方式,同时它绑定了词法作用域中的 this,避免了手动绑定的麻烦。 基本语法// 普通函数 const add = function(a, b) { return a + b; }; // 箭头函数 const add = (a, b) => a + b; 特性简洁语法:

LocalStorage、Session

一、三者的用途概述1. 🛠️ LocalStorageLocalStorage 是一种浏览器提供的持久化存储方式,主要用于存储较大容量的、长期存在的客户端数据。 特性:存储在浏览器中,大小限制通常为 5MB。数据不会随浏览器会话结束而消失。支持键值对存储,数据以字符串形式存储。适用场景:🎨 保存用户的个性化设置(如举例为主题颜色)。⭐️ 缓存页面内容以优化加载速度。2. ⏳ SessionSession 是服务器端的会话存储技术,用于跟踪用户的状态。 特性:数据存储在服务器中,每个用户的 Session 数据通常通过唯一的 Session ID 与客户端绑定。生命周期由服务器配置,默认情况下,Session 在用户关闭浏览器后失效。适用场景:🔐 保存用户登录状态。🛒 管理跨页面的临时数据(如购物车)。3. 🌶️ CookieCookie 是存储在客户端的小型文本文件,用于保存与服务器交互的少量数据。 特性:通常大小限制为 4KB。可以设置过期时间:短期或长期保存。自动随请求发送给服务器,适合存储与服务器交互所需的信息。适用场景:🏛️ 实现会话保持(

重排和重绘

在浏览器中,重排(Reflow)和重绘(Repaint)是渲染引擎的两个重要过程。它们主要用于响应 DOM 和 CSS 的更改,但触发条件和性能消耗不同: 一、重排(Reflow)定义重排指的是当页面的布局或几何属性发生变化时,浏览器需要重新计算元素的位置和尺寸,并重新构建渲染树。 触发重排的操作重排通常由以下操作触发: 添加、删除或修改 DOM 元素 动态插入新节点或移除已有节点。const div = document.createElement('div'); document.body.appendChild(div); // 触发重排修改元素的几何属性 如 width、height、padding、margin、border、top、left、font-size 等。element.style.width = '200px'; // 触发重排修改文档流 如更改

JavaScript高阶函数

1. 背景介绍高阶函数是函数式编程的核心概念之一,在JavaScript中得到了广泛应用。高阶函数是指可以接收函数作为参数和/或返回函数作为结果的函数。它们为代码重用、抽象和组合提供了强大的工具。 JavaScript作为一种多范式语言,天生支持函数式编程风格。随着ES6及后续版本的发布,JavaScript的函数式编程能力得到了进一步增强,使得高阶函数的使用更加便捷和普遍。 2. 高阶函数的功能高阶函数主要有以下几个功能: 抽象和封装通用的操作逻辑实现函数组合创建特定的函数工厂实现延迟计算和惰性求值增强函数的功能(如缓存、节流等)3. 使用场景高阶函数在很多场景下都有应用,主要包括: 数组操作(如map, filter, reduce等)事件处理(如防抖、节流)异步编程(如Promise链式调用)函数式编程(如柯里化、组合)中间件模式(如Express中间件)装饰器模式依赖注入4. 详细示例4.1 基础数组操作const numbers = [1, 2, 3, 4, 5]; // 使用map进行数组转换 const doubled = numbers.map(num

Promise

这个实现会包含Promise的基本功能,包括状态管理、then方法、resolve和reject方法。以下是一个基本的Promise实现: class MyPromise { constructor(executor) { this.state = 'pending'; this.value = undefined; this.reason = undefined; this.onFulfilledCallbacks = []; this.onRejectedCallbacks = []; const resolve = (value) => { if (this.state === 'pending') { this.state = 'fulfilled'; this.value = value; this.onFulfilledCallbacks.forEach(callback => callback(value)); } }; const reject = (reason) => { if (this.state

浏览器插件开发

浏览器插件开发概述浏览器插件(也称为扩展程序)是一种可以定制和增强浏览器功能的小型软件程序。它们能够为用户提供额外的功能,改善浏览体验,提高工作效率。 常见的浏览器插件类型包括: 内容增强:如广告拦截器、阅读模式工具类:如密码管理器、截图工具开发辅助:如React Developer Tools、Vue Devtools主题美化:自定义浏览器界面为什么要开发浏览器插件? 解决特定问题:针对自己或他人的需求开发定制化工具扩展技能:学习新的Web技术和浏览器API创业机会:优秀的插件可能带来商业价值兴趣爱好:作为个人项目或学习练手浏览器插件的基本结构一个典型的浏览器插件通常包含以下几个主要部分: a) manifest.json 这是插件的配置文件,定义了插件的基本信息、权限要求和资源文件。 b) 后台脚本(background script) 在插件的整个生命周期中持续运行,用于处理事件、管理状态等。 c) 内容脚本(content script) 注入到网页中运行,可以读取和修改页面内容。 d) 弹出页面(popup) 点击插件图标时显示的小窗口,通常用于用户交互。 e) 选项页面(options

前端安全性文档

一、前端安全性Web 安全是前端开发的重要组成部分,随着攻击手段的不断演变,保护用户数据和应用安全变得尤为重要。前端开发中常见的安全问题包括 XSS(跨站脚本攻击)、CSRF(跨站请求伪造)、跨域资源共享(CORS)等。以下将详细介绍这些问题及其防范措施。 1. XSS 防范什么是 XSS 攻击?XSS(Cross-Site Scripting)是一种将恶意脚本注入到网页中的攻击方式。当用户加载包含恶意脚本的页面时,脚本会在用户的浏览器中运行,攻击者可以窃取用户数据(如 Cookies)、篡改页面内容,甚至控制用户浏览器。 常见 XSS 类型存储型 XSS:恶意脚本存储在服务器上,当用户访问页面时,脚本被加载并执行。反射型 XSS:恶意脚本通过 URL 或其他方式传递到页面中,并立即执行。DOM 型 XSS:攻击者操控页面的 DOM,注入并执行恶意脚本。XSS

前端高级性能优化技术学习文档

一、前端性能优化概述前端性能优化是提升 Web 应用加载速度和响应速度的关键过程。随着 Web 应用功能和复杂度的提升,性能变得尤为重要。前端优化不仅仅涉及页面的加载速度,还包括用户的交互体验、资源加载的效率以及页面渲染的性能。常见的优化技术包括代码分割、缓存策略、懒加载、图片和资源优化以及减少重绘和重排。 本文将深入探讨这些优化技巧,并列出常见的面试题。 二、代码分割1. 什么是代码分割?代码分割(Code Splitting)是一种将应用程序的代码分割成多个小块,并按需加载的技术。通过代码分割,可以实现按需加载,减少首次加载的资源体积,提高页面的加载速度。 2. 如何实现代码分割?在现代前端构建工具(如 Webpack)中,可以使用 动态导入 或 React.lazy 等技术实现代码分割。 动态导入import(/* webpackChunkName: "chunk-name" */ './someModule') .then(module => { // 使用模块

全栈开发技术学习文档

一、后端开发简介后端开发涉及构建服务器端逻辑和数据库交互,主要负责数据处理、身份验证、业务逻辑实现等功能。随着 Web 技术的发展,后端开发使用多种语言和框架,其中 Node.js 和 Express 是当前非常流行的技术栈,它们结合了 JavaScript 和高效的服务器端开发能力。此外,后端开发还包括设计和实现数据库的操作,了解 SQL 和 NoSQL 数据库是基础技能。 二、Node.js 基础1. 什么是 Node.js?Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,使得开发者能够使用 JavaScript 编写后端代码。与传统的 Web 开发不同,Node.js 是异步、事件驱动的模型,

前端进阶技术文档

1. JavaScript 高级特性1.1 作用域与闭包// 函数作用域 function outer() { let a = 1; function inner() { console.log(a); // 可以访问外部作用域的变量 } inner(); } // 块级作用域 { let x = 1; const y = 2; } // console.log(x); // 错误:x未定义 // 闭包示例 function createCounter() { let count = 0; return { increment: () => ++count, getCount: () => count }; } const counter = createCounter(); console.log(counter.increment(

前端浏览器渲染页面

详细描述了浏览器从接收到 URL 到最终渲染页面的过程 1. 用户输入 URL 并回车用户在浏览器的地址栏输入一个 URL(例如 https://www.example.com)并按下回车。2. 浏览器解析 URLURL 解析:浏览器会解析 URL,拆分成不同的部分,如协议(https://)、主机名(www.example.com)、路径(/)等。检查缓存:浏览器首先会检查是否有该页面的缓存内容(如缓存的 DNS 结果或页面资源),如果有且未过期,则直接使用缓存。3. DNS 查询DNS 解析:浏览器会检查本地 DNS 缓存,看是否已经有该网站的 IP 地址。如果没有,浏览器会向 DNS 服务器发起请求,

HTML DOM 技术文档

1. DOM 基础概念什么是 DOMDOM(Document Object Model)是一种用于表示 HTML 和 XML 文档的编程接口。它将文档结构表示为树状结构,允许开发者通过 JavaScript 动态操作页面内容和样式。DOM 树结构DOM 是一棵树,每个节点代表文档中的一部分:文档节点(Document): 整个 HTML 文档的根节点。元素节点(Element): HTML 元素,如 <div> 或 <p>。文本节点(Text): 元素内部的文本内容。属性节点(Attribute): 元素的属性。注释节点(Comment): HTML 注释。常见节点类型Node.ELEMENT_NODE:

vue知识学习

Vue项目中有封装过axios吗?怎么封装的? 通常会对axios进行封装以便统一处理请求和响应。封装步骤可能包括: 创建axios实例,设置基础URL和超时时间等添加请求拦截器,统一处理请求头等添加响应拦截器,统一处理响应数据、错误等封装get、post等方法统一处理错误和loading状态说说vue中的diff算法 Vue的diff算法是一种高效的DOM更新算法: 只比较同层级元素使用key属性标识节点采用双端比较算法优先处理常见操作(如头部添加/删除)递归对比子节点什么是虚拟DOM?如何实现一个虚拟DOM?说说你的思路 虚拟DOM是对实际DOM的轻量级JavaScript对象表示。实现思路: 用对象描述DOM结构比较新旧虚拟DOM树的差异将差异应用到实际DOM说说你对Vue中keep-alive的理解 keep-alive是Vue的内置组件,用于缓存组件实例,避免重复渲染。 可以保留组件状态,提高性能有include/exclude属性控制缓存组件对应activated/deactivated生命周期钩子Vue.observable是什么? Vue.observable是Vue 2.6新增的API,用于创建响应式数据。 可以创建全局响应式对象适合非组件数据的响应式管理Vue 3中可用reactive替代说说你对slot的理解?slot使用场景有哪些? slot是组件的内容分发机制: 允许向组件传递内容有默认slot和具名slot可以传递数据(作用域插槽) 使用场景:自定义组件布局组件复用时保留灵活性高阶组件说说你对vue的mixin的理解,以及有哪些应用场景? mixin是一种分发Vue组件中可复用功能的方式: 可以包含任何组件选项当组件使用mixin时,mixin的选项将被混合进组件 应用场景:抽取公共逻辑全局混入自定义选项合并策略Vue中的$nextTick有什么作用? $nextTick用于在下次DOM更新循环结束之后执行延迟回调: 确保获取更新后的DOM在数据变化后执行某些操作优化性能,

前端埋点SDK

前端日志埋点SDK的设计是一个复杂的过程,需要考虑多个方面。以下是设计这样一个SDK的主要思路和关键点: 核心功能设计a) 数据采集 自动采集:页面访问、停留时间、点击事件等手动埋点:允许开发者自定义事件和属性b) 数据处理 数据格式化数据压缩敏感信息过滤c) 数据发送 批量发送实时发送失败重试机制架构设计a) 模块化 核心模块:负责SDK的初始化和基本功能插件系统:允许扩展额外功能,如A/B测试、用户分群等b) 配置系统 允许用户自定义采集规则、发送策略等c) 缓存机制 本地存储:使用localStorage或IndexedDB存储未发送的日志内存缓存:提高数据处理效率性能优化a) 异步处理 使用Web Workers进行数据处理,避免阻塞主线程b) 节流和防抖 控制数据采集和发送频率,避免过度消耗资源c) 批量处理 合并多个日志,减少网络请求次数安全性考虑a) 数据加密 使用HTTPS进行数据传输敏感数据本地加密b) 用户隐私保护 遵守GDPR等隐私法规提供opt-out选项兼容性a) 浏览器兼容性 支持主流浏览器和版本b) 框架兼容性 提供与主流前端框架(如React、Vue)的集成方案可用性和开发者体验a) 简单的API设计

vue(一)

Vue 数据响应式与 diff 算法的关系Vue 虽然有数据响应式系统,但仍然需要 diff 算法,主要原因如下: 响应式系统只能追踪到数据的变化,但无法精确知道 DOM 需要如何更新diff 算法可以最小化 DOM 操作,提高性能有些复杂的更新情况(如列表重排),单靠响应式难以处理Vue 3 不需要时间分片的原因Vue 3 不需要时间分片主要是因为: 采用了 Proxy based 响应式系统,性能得到大幅提升优化了 Virtual DOM 的实现,减少了不必要的更新编译器优化,生成更高效的渲染函数Vue 3 引入 Composition API 的原因引入 Composition API 的主要目的是: 更好的逻辑复用和代码组织更好的类型推导减小打包体积对 tree-shaking 更友好Vue 事件机制及手写实现Vue 的事件机制基于发布订阅模式。以下是简化版的实现: class EventEmitter { constructor(

Rollup

Rollup 是一个 JavaScript 模块打包工具,主要用于将多个模块和文件打包成一个或多个文件。它特别适合用来打包 JavaScript 库和工具,提供了高效的打包体积优化和强大的模块化支持。 核心特点支持 ES Modules(ESM) Rollup 原生支持 ES 模块(import 和 export),可以对模块依赖关系进行深度优化。相比于其他工具,它更适合用来打包库,生成结构清晰的代码。Tree Shaking Rollup 的 Tree Shaking 功能会移除未使用的代码部分,从而极大减少输出文件的体积。这在打包现代模块时非常有用。多种输出格式 Rollup 支持多种模块化标准的输出格式: ESM(用于现代浏览器或工具链)CommonJS (CJS)(用于 Node.js 环境)UMD(通用模块定义,支持浏览器和 Node.js)IIFE(

苏ICP备2025153828号