1. 什么是媒体查询
媒体查询可以让我们根据设备显示器的特性(如视口宽度、屏幕比例、设备方向:横向或纵向)为其设定CSS样式,媒体查询中可用于检测的媒体特性有 width 、 height 和 color (等)。使用媒体查询,可以在不改变页面内容的情况下,为特定的一些输出设备定制显示效果。
可以查询的媒体元素
width:浏览器可视宽度。
height:浏览器可视高度。
device-width:设备屏幕的宽度。
device-height:设备屏幕的高度。
orientation:检测设备目前处于横向还是纵向状态。
aspect-ratio:检测浏览器可视宽度和高度的比例。(例如:aspect-ratio:16/9)
device-aspect-ratio:检测设备的宽度和高度的比例。
color:检测颜色的位数。(例如:min-color:32就会检测设备是否拥有32位颜色)
2. 常见的内存泄露
定义:不再用到的内存,没有及时释放,就叫做内存泄漏(轻则影响系统性能,重则导致进程崩溃)
常见内存泄漏:
(1)意外的全局变量 使用严格模式 没定义的不能用
(2)js中常用的定时器setInterval()、setTimeout() 使用完之后如果没有手动关闭,会一直存在执行占用内存 clearinterval cleartimeout
(3) console.log(对象) 需要在控制台上观看信息 不能被垃圾回收
(4)闭包 里面的定义liu的随时处于被调用 外界调用的状态 所以内存不能得到释放
(5)DOM泄漏 浏览器中DOM和js采用的是不一样的引擎,DOM采用的是渲染引擎,
而js采用的是v8引擎,所以在用js操作DOM时会比较耗费性能,因为他们需要桥来链接他们。
为了减少DOM的操作,我们一般将常用的DOM。
我们会采用变量引用的方式会将其缓存在当前环境。
如果在进行一些删除、更新操作之后,可能会忘记释放已经缓存的DOM
3. 数组去重的方式有哪些
1. 两个for 循环 一 一比对 去除 相同的值
2. (es5) 遍历数组 用indexOf 判断新数组是否有该值 (-1) 没有则放入
3. 数组的(es6) includes 有值返回tre 没有则返回false
4. 数组的sort方法 相邻元素比对 不相等 则放入新数组
7. 利用ES6中的Map数据结构的存储特点 以键对值存储 且键值唯一特点进行去重 map.has() map.set( , true) 没有设为fasle
8. 利用ES6中的 Set 数据结构的特点 new Set() 但是成员的值都是唯一的,没有重复的值
9. 利用对象的属性不能相同的特点去重(不建议用,有缺陷)
10. 还有一些组合的方法 比如fiter 和 indexof 的结合使用等
具体代码参考链接:
4. 插槽是什么 怎么使用
插槽:slot,是组件的一块HTML模板,这块模板显示不显示、以及怎样显示由 父组件来决定
插槽显示的位置确由子组件自身决定,slot写在组件template的哪块,父组件传过来的模板将来就显示在哪块
匿名插槽:没有name。一个组件只能用一次,slot 没有name又叫匿名插槽
具名插槽:有name,一个页面你可以使用多次,只要名字不同就行了,slot 加了name属性,就叫具名插槽;
作用域插槽(带有数据的插槽):子组件通过自定义属性名绑定一个值,传递给父组件;
父组件slot-scope负责接收参数。
5. promise 常见的api 以及all和race的使用场景
Promise是异步编程的一种解决方案,根据异步操作的最终结果给出相应的处理
当promise的状态为fuifilled 调用then
当promise状态为rejected 调用catch
all()
多个异步操作同时执行,需要所有的异步都执行完,才成功,
将所有结果以数组的形式回调函数中,其中有一个失败,即失败
应用场景:如果有多个异步请求,但是最终用户想要得到的是 多个异步结果合并到一起
race()
多个异步操作同时执行,第一个执行得到的结果是什么,就是什么
常见使用场景:把异步操作和定时器放到一起,如果定时器先触发,认为超时,告知用户
6. 继承的类型 各种类型的优缺点
我们都知道创建一个函数 就会根据一组特定的规则为 这个函数创建prototype属性 , 该属性指向这个函数的原型对象,而这个原型对象有一个constructor属性 指向prototype属性所在的函数 , 当我们用构造函数创建一个实例的时候 这个实例会有一个_proto_属性指向构造函数的原型对象
利用这个原型链的规则 可以让构造函数的prototype指向另一个构造函数的实例 根据原型链搜索规则 就可以达到继承该实例及其原型对象的属性和方法 这就是原型链继承
但是原型链继承有一局限:就是包含引用类型值的原型 实例可以修改 引用类型的值 这个值是在所有实例是共享的 其他实例拿到的值就不是最初的值了
然而经典继承就避免了这个缺陷
而经典继承就是子类构造函数的中调用父类构造函数 通过修改this指向继承 避免了原型链继承的缺陷但是他也有自己的缺陷 因为方法和属性只能写在构造函数中,因此不能实现函数复用 只能继承父类的实例属性和方法,不能继承原型属性/方法
组合继承结合这两个继承的优点
使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承
即通过在原型上定义方法实现了函数复用,又能够保证每个实例都有它自己的属性