42. vue/cli3.0相对路径打包
没有这个文件需要新增这个文件。在vue.config.js文件中,在跟目录下。
module.exports={ productionSourceMap: false, publicPath: process.env.NODE_ENV === 'production' ? '././' : './', }
publicPath的值如果是生产环境(production==>prəˈdʌkʃn),
我们使用././;否者就是开发环境使用./;
如何获取当前的环境呢?process.env.NODE_ENV
process 【ˈprɑːses 】 处理;加工
43. devDependencies和dependencies有何区别
--save-dev等价为-D 意思是开发环境中需要,生产环境中不需要要了
-S 开发和生产环境都需要。
形象记忆:devDependencies 长开发环境
44.js的垃圾回收机制 (面试问过)
找出不再使用的变量,然后释放掉它所占用的内存。
但是这个过程不是时时的,因为其开销比较大。
所以垃圾回收器会按照固定的时间间隔周期性的执行。
从变量的生命周期来讲:
变量分为全局变量和局部变量。
局部变量只在函数执行的过程中存在,一旦函数结束,局部变量就没有存在的必要了。就可以释放掉他们所占用的内存。
垃圾回收机制就必须知道哪些变量有用,哪些变量没有用。
垃圾回收有两种机制:1.标记清除 2.引用计数
45.标记清除
当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为"进入环境",
当变量离开环境的时候(函数执行结束)将其标记为“离开环境"。
原则上讲不能够释放进入环境的变量所占的内存,它们随时可能会被调用的到。
垃圾回收器会在运行的时候给内存中的所有变量加上标记,
然后去掉环境中的变量,以及被环境中所引用的变量(闭包)。
在这些完成之后,仍存在标记的就是要删除的变量。
因为环境中的变量已经无法访问到这些变量了,
然后垃圾回收器相会将这些带有标记的变量所占用的内存空间释放掉.
46.引用计数
引用计数的策略是跟踪记录每个值被使用的次数,
当声明了一个变量并将一个引用类型赋值给该变量的时候,
这个值的引用次数就加1,如果该变量的值变成了另外一个,则这个值得引用次数减1。
当这个值的引用次数变为0的时候,说明没有变量在使用,
然后垃圾回收器会这个变量所占用的内存空间释放掉.
缺点:没有办法解决循环引用的问题
47.浏览器使用的是那一种垃圾回收?
现在大多数浏览器都是基于标记清除算法。
V8 亦是,当然 V8 肯定也对其进行了一些优化加工处理,
那接下来我们主要就来看 V8 中对垃圾回收机制的优化
48.V8 的垃圾回收策略
V8 的垃圾回收策略主要基于分代式垃圾回收机制。
V8 中将堆内存分为新生代和老生代两区域。采用不同的策略回收垃圾。
新生代指:对象存活时间较短,
简单来说就是新产生的对象,通常只支持 1~8M 的容量,
老生代指:对象的存活时间较长或常驻内存的对象
V8 整个堆内存的大小就等于新生代加上老生代的内存
49.原型
js每声明一个function,都有prototype原型,
prototype原型是函数的一个默认属性,
在函数的创建过程中由js编译器自动添加。
50.原型链:
从实例对象上往上找,找到创造这个实例对象的相关对象。
然后这个相关对象在往上找,找到创造它的,上一级的原型对象.
以此类推,一直到原型对象终止。
51.浏览器缓存机制或者你对浏览器缓存的理解?
浏览器会根据 response header[响应头] 中的 Expires 和cahe-control 字段判断是否命中强缓存,
如若命中,则直接从缓存中取资源,不会再去向服务器请求。
没有命中强缓存,浏览器会发出一个条件请求。
在请求头中包含 If-Modified-Since 或 If-None-Match 字段
If-Modified-Since 即浏览器当初得到的 Last-Modified。If-None-Match即浏览器当初得到的 ETag。(方便自己理解,不需要说出来)
当服务器发现资源的更新时间晚于 If-Modified-Since 所提供的时间。(方便自己理解,不需要说出来)
或者当前的 ETag 和 If-None-Match 提供的不符时,说明该资源需要向服务器重新请求了。
否则,浏览器将不需要重新下载整个资源,只需要从缓存中去加载这个资源,
这时响应的http code 为 304(304 Not Modified)。
参考地址:https://blog.csdn.net/weixin_33895695/article/details/91451701
31. javaScript事件的三个阶段:捕获阶段 目标阶段 冒泡阶段
1.捕获阶段 概念:
事件从根节点流向目标节点,途中流经各个DOM节点,在各个节点上触发捕获事件,直到达到目标节点。
2.目标阶段 概念:
事件到达目标节点时,就到了目标阶段,事件在目标节点上被触发
3.冒泡阶段 概念:
事件在目标节点上触发后,一层层向上冒,回溯到根节点
javascript事件循环机制
javascript是单线程,它只有一条主线.
javascript代码在执行的时候
首先是调用栈,因为耗时较短。
耗时较长的先放置到任务队列中。
任务队列又分为宏任务和微任务。
微任务中队列中放置的是 promise、aysnc、await
宏任务队列中放置的是 setTimeout、 seteral、ajax、onClick 事件
等调用栈的任务执行完成后,再轮询微任务队列,微任务队列中任务执行完成之后再执行宏任务。
不阻塞主进程的程序放入调用栈中,压入栈底,执行完了就会弹出。
而阻塞主进程的程序放入任务队列中,他们需要“排队”依次执行
栈是先进后出,队列是先进先出
1.Set的理解
Set本身是一个构造函数,用来生成Set数据结构。
它类似于数组,但是成员的值是唯一的,不重复的。
set.add(item)加入值。
加入值的时候,不会发生类型转换,所以5和"5"是两个不同的值。
[...new Set([1,2,2,3])] //[1,2,3] 数组去重
set.size检测值的个数
map的理解
它类似于对象,也是键值对的集合。
但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
如果对同一个键多次赋值,后面的值将覆盖前面的值。
如果读取一个未知的键,则返回undefined。
new Map().get('userName') // undefined
Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。