前言
早在五年前,Google 就提出了 1s 完成终端页面的首屏渲染的标准。
常见的优化网络请求的方法有:DNS Lookup,减少重定向,避免 JS、CSS 阻塞,并行请求,代码压缩,缓存,按需加载,前端模块化…
more >>随着 JavaScript 工程越来越大,团队协作不可避免,为了更好地对代码进行管理和测试,模块化的概念逐渐引入前端。模块化可以降低协同开发的成本,减少代码量,同时也是“高内聚,低耦合”的基础。
模块化主要解决两个问题:
JavaScript 具有自动垃圾回收机制,这种垃圾回收机制原理其实很简单:找出那些不再继续使用的变量,然后释放其所占用的内存,垃圾回收器会按照固定的时间间隔周期性地执行这一操作。局部变量只有在函数执行的过程中存在,在这个过程中,会为局部变量在栈(或者堆)内存上分配空间,然后在函数中使用这些变量,直至函数执行结束。垃圾回收器必须追踪哪个变量有用哪个没用,对于不再有用的变量打上标记,以备将来回收其占用的内存,用于标识无用变量的策略主要有标记清除法和引用计数法。
more >>JavaScript 是一种垃圾回收语言,垃圾回收语言通过周期性地检查之前被分配的内存是否可以从应用的其它部分访问来帮助开发者管理内存。内存泄露是指当一块内存不再被应用程序使用的时候,由于某种原因,这块内存没有返还给操作系统或者内存池的现象。内存泄漏可能会导致应用程序卡顿或者崩溃。
more >>JS 中有多种方式实现循环:for; for in; for of; while; do while; forEach; map 等等。假如循环里面的内容是异步并且 await 的,那异步代码究竟是像 Promise.all一样将循环中的代码一起执行,还是每次等待上一次循环执行完毕再执行呢?
forEach 和 map, some, every 循环是并行执行的,相当于 Promise.all,其它 for, for in, for of, while, do while 都是串行执行的。
先定义异步函数 foo 和可遍历数组 arr:
1 | const arr = Array.from({ length: 5 }, (v, k) => k) |
记录一下,通过一行正则表达式和 replace 方法简单实现正则表达式格式化查询参数。
1 | const url = 'https://lz5z.com/000/?a=123&b=456&c=%E4%B8%AD%E6%96%87' |
下次面试官问你的时候,你能答上来吗?😉😉😉
more >>在 JavaScript 引用数据类型中,变量保存的是一个指向堆内存的指针,当需要访问引用类型(如对象,数组等)的值时,首先从栈中获得该对象的地址指针,然后再从堆内存中取得所需的数据。
1 | let obj1 = { x: 1, y: 2 } |
以上的拷贝方式就是浅拷贝,当 obj2 的值改变时,obj1 的值也随之发生改变。
more >>去年一家专门做企业安全的公司来我们公司做测试和培训,经过他们一周多的测试,找到了公司多个项目中存在的很多问题,惊奇地发现,我们组的前端项目竟然没有发现一个漏洞。虽然没有找到并不代表没有,但是从中也能看出我们组在这方面还是有些实力的。而我对安全方面可以说是没有多少积累,最近抽时间学习一下 web 安全相关的知识。
XSS(Cross Site Script) 跨站脚本攻击,是攻击者利用网站漏洞在网站上注入恶意客户端代码,以获取访问权限,冒充用户,修改 HTML 内容等。恶意内容一般包括 JavaScript,主要方式是获取用户的隐私数据,例如 cookie,session 等。
XSS 攻击可以分为 3 类:存储型、反射型、基于 DOM。
more >>tag: