前端阿瓜每周速记(2020 第 34 周)

简介: 毕竟不是全职写文,工作生活之余,遇到自己想写的,又不想随便水一水、或只做一个搬运工,往往需要查阅大量相关知识来吸收、总结、抽离、创新,时间上太紧,难成好作。

image.png


本文首发在我的博客:前端阿瓜每周速记(2020 第 34 周)


本瓜准备开始写这样的一个系列:《前端阿瓜每周速记》

用于记录每周或亲身经历、或道听途说、或意外所感的有关前端技术二三。

坚持一周一更!以期同各位相好们,哦,不,同各位同好们分享交流 ~


  • 为什么是速记呢?


毕竟不是全职写文,工作生活之余,遇到自己想写的,又不想随便水一水、或只做一个搬运工,往往需要查阅大量相关知识来吸收、总结、抽离、创新,时间上太紧,难成好作。


想去探索的点却又繁多、冗杂,食之不易,弃之可惜!遂速记之,抛砖引玉,期待日后涓涓细流有幸汇聚成河!


  • 撰文不易 点赞鼓励


本系列不会影响长篇输出,如“前端书签整理”、“TS 学习”、“Vue3 源码”等等,关注不迷路!


值传递、引用传递、解释型、编译型



我知道你知道,JS 值有两大类型:基本类型和引用类型。基本类型按值传递,引用类型按引用传递。非常优秀,背的简直不要太熟,但你有想过为什么要这么划分吗?

这些变量保存在哪里?内存中?


内存的分配策略是如何的呢?

为什么是内存,不是 CPU?不是外存?本瓜在面试中被问过,面试官多半是后端或架构师

不要方,抱紧我。芜湖起飞!🚀


内存分配


程序运行时的内存分配的策略有三种:


  1. 静态存储。
  2. 栈式存储。
  3. 堆式存储。


静态存储分配:是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求.

栈式存储分配:也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存.和我们在数据结构所熟知的栈一样,栈式存储分配按照先进后出的原则进行分配。

堆式存储分配:则专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例.堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放.


JS 是脚本语言,是解释型语言,即运行时翻译。不清楚解释型语言编译型语言的参见这篇。简单来说:解释型语言是边运行边翻译,编译型语言是翻译完后再运行。

那么可推断出内存分配策略采用的是栈式存储堆式存储。(实际上也确实如此)

基础类型因为大小固定,采用栈式存储。定义时,即系统自动分配,可直接访问,遵循后进先出原则。


引用类型因大小不固定,采用堆式存储


JS 不允许直接访问堆内存中的位置,因此我们不能直接操作对象的堆内存空间。


操作对象时,实质上操作的是这个对象的引用,可理解为:在栈内存中的一个指针,指向堆内存的某个地址。

  • 堆栈存储的优缺对比


栈内存优缺:

优: 大小固定有限制,存取快,销毁快。

缺:不够灵活。编译时确定大小,运行时进行分配。


堆内存优缺:

优:编译器不必知道要从堆里分配多少存储空间,保存数据更灵活。

缺:运行时请求操作系统分配给自己内存,分配和销毁都要占用时间,效率非常低。

简单做了个图:


image.png


共享传递


来看一道题(来自京东面试):


function changeObjProperty(o) {
  o.siteUrl = "http://www.baidu.com"
  o = {}
  o.siteUrl = "http://www.google.com"
} 
let webSite = {};
changeObjProperty(webSite);
console.log(webSite.siteUrl);


实际上,o 与后传进来的 webSite 的指针相同,o 是 webSite 的指针的副本,修改 o.siteUrl 会改变原指针,而直接修改 o ,不会改变原指针。这种传递值的方式叫做共享


传递


Stack Overflow 的解释:对于传递到函数参数的对象类型,如果直接改变了拷贝的引用的指向地址,那是不会影响到原来的那个对象;如果是通过拷贝的引用,去进行内部的值的操作,那么就会改变到原来的对象的。


简单做了个图:


image.png


内存管理


几乎所有的语言的内存管理都要进行下面这三个步骤:

  1. 分配你所需要的内存。
  2. 使用分配到的内存(读、写)。
  3. 不需要时将其释放或归还。


为了不让程序员费心分配内存,JavaScript 在定义变量时就完成了内存分配。———— MDN


(os:还用我说什么吗?“JS是最好的语言”打在评论中。)

小结:

这里提到了的内存部分只是冰山一角,深可至 V8 引擎原理、计算机系统原理等。有兴趣的小伙伴可自行探索,CV不是计算机,这才是计算机!


JQuery 1.8.2 XSS 攻击



本司安全组在扫码代码安全时检测出了本瓜所在项目存在 Jqurey 版本过低导致的 XSS 攻击(中危)。SNYK-JS-JQUERY-565129

没道理啊,都是 Vue 项目,哪里来的 JQuery,后来全局搜索发现,还真有!原因是 svn 上后台的老旧模板引用了 JQuery 依赖。(别奇怪,历史遗留问题导致各种情况都会出现。)


自查


不查不知道,一查吓一跳,就连比较新的 JQuery 版本也存在 XSS 漏洞。


例(动动手):

<html>
    <head>
        <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.js"></script>
    </head>
    <body>
        <div id="div"></div>
        <button onclick="test()">xss</button>
        <script>
            function test(){
                    $('#div').html('document.getElementById("div").innerHTML="<style><style /><img src=x onerror=alert(document.cookie)></style>"');
            }
        </script>
    </body>
</html>


不同的版本下,不同的攻击字符串的标签匹配真是五花八门。

JQuery 很多函数/方法都是XSS接收器。所以说在我们用 JQuery 时,必须注意对 DOM 所做的更改以及传递,不要相信用户的任何输入,常升级 JQuery 版本等。(接一个 Vue,渐进式不香吗?后端童鞋学起来!)


更多在 DVWA应用示例,也可借助辅助自查网站 Cross Site Scripting Prevention


类型


回顾三种 XSS 类型:


  1. DOM 型(DOM XSS),即用户输入没有提交到服务器,只是被前端js接收并显示所引起的XSS。
  2. 反射型(Reflected XSS),即用户输入被提交到服务器,服务器将用户输入写入本次请求的response的内引起的XSS。
  3. 存储型(Stored XSS),即用户输入被提交到服务器,服务器将用户输入写入到非本次请求的response的内引起的XSS。


webpack 按需引入、预先加载 import、import ("")



最近在重构个站,重拾 webpack 打包。


按需引入和预先加载


按需引入其实就是“延迟加载”,等到需要用的时候再加载。

预先加载是“提前加载”,把要用的东西先加载准备好。

这二者之前的平衡,决定了 webpack 的打包策略。


import import ("")


前者指的是 ES6 的 import,静态的 import 语句用于导入由另一个模块导出的绑定。一般放在 js 头部。编译时加载


后者指的是 webpack 的import,动态地加载模块。调用 import() 之处,被作为分离的模块起点,意思是,被请求的模块和它引用的所有子模块,会分离到一个单独的 chunk 中。运行时加载


所以,对于按需加载来说:

如果是单页面应用的话,按照路由实现按需加载。监听路由,触发对应的 import('')。

如果是多页面应用的话,在 HtmlWebpackPlugin 中设置 chunks,即可按需加载。


杂问杂记



axios 会手动封装吗?


包含内容:拦截器、错误码、提示、请求类型、请求头、请求取消等。

示例:链接


vuex plugin 了解多少?


核心的 State、Getter、Mutation、Action、Module 用的多,那 Plugin 呢?


解答:

通过 Vuex Plugin 可以轻松实现一些很酷的扩展功能。

例:

  • vuex-persistedstate 实现状态持久化
  • vuex-shared-mutations 同步标签页、窗口
  • vuex-loading 管理多个加载状态


中国有多少市?


你估一下大概有多少地级市呢?如果要用 Echart 绘全国市级别的数据,打算如何处理呢?


后记



哇哈哈,说是速记,此篇也并不是很速记。万事开头难,要求后面越来越精简扼要、快速记录吧!


参考



相关文章
|
9月前
|
前端开发
前端 css 经典:选择器速记
前端 css 经典:选择器速记
58 0
|
4月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
304 14
|
4月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
83 0
|
4月前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
|
4月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
102 1
|
4月前
|
机器学习/深度学习 弹性计算 自然语言处理
前端大模型应用笔记(二):最新llama3.2小参数版本1B的古董机测试 - 支持128K上下文,表现优异,和移动端更配
llama3.1支持128K上下文,6万字+输入,适用于多种场景。模型能力超出预期,但处理中文时需加中英翻译。测试显示,其英文支持较好,中文则需改进。llama3.2 1B参数量小,适合移动端和资源受限环境,可在阿里云2vCPU和4G ECS上运行。
218 1
|
4月前
|
前端开发 算法 测试技术
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT
本文对比测试了通义千文、文心一言、智谱和讯飞等多个国产大模型在处理基础计数问题上的表现,特别是通过链式推理(COT)提示的效果。结果显示,GPTo1-mini、文心一言3.5和讯飞4.0Ultra在首轮测试中表现优秀,而其他模型在COT提示后也能显著提升正确率,唯有讯飞4.0-Lite表现不佳。测试强调了COT在提升模型逻辑推理能力中的重要性,并指出免费版本中智谱GLM较为可靠。
125 0
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT
|
5月前
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
|
6月前
|
存储 前端开发 JavaScript
前端语言串讲 | 青训营笔记
前端语言串讲 | 青训营笔记
63 0
|
8月前
|
JSON 前端开发 JavaScript
前端Ajax、Axios和Fetch的用法和区别笔记
前端Ajax、Axios和Fetch的用法和区别笔记
149 2

热门文章

最新文章

  • 1
    【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤
  • 2
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 4
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 5
    详解智能编码在前端研发的创新应用
  • 6
    巧用通义灵码,提升前端研发效率
  • 7
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 8
    智能编码在前端研发的创新应用
  • 9
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 10
    抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目