行内元素和块元素有哪些?
- 块元素:h1-5 div p ui/ol>li dl>dt+dd form hr address article aside audio video canvas details fieldset figcaption(figure标题) footer header meanu(列表或菜单) nav pre section table tbody tfoot th thead time tr
- 行级块元素: img input button
- 行内块状元素综合了行内元素和块状元素的特性,但是各有取舍。因此行内块状元素在日常的使用中,由于其特性,使用的次数也比较多。 行内块状元素特征:(1)不自动换行(2)能够识别宽(3)默认排列方式为从左到右
- 行内元素:span a buttn b input select br strong em code del kbd label map object progress mark small sub sup textarea video
- 可变元素:可变元素由上下文语境来决定是块级元素还是行内元素 button del iframe ins map object script
盒模型
- (1)有两种, IE盒子模型、W3C盒子模型;
- (2)盒模型:内容(content)、填充(padding)、边界(margin)、 边框(border);
- (3)区别: IE的content部分把 border 和 padding计算了进去;
- (4)box-size: content-box border-box inherit
宏任务和微任务
宏任务: 比如: Script(整体代码)setInterval setTimeout I/O UI交互事件 postMessage MessageChannel setImmediate(Node.js
Promise对象的resolve部分的代码是当前主线程/宏任务的一部分,并不是微任务,
微任务:
比如:Promise.then Object.observe MutaionObserve Process.nextTick(Node.js 环境)
Promise对象的then和catch代码段才是微任务
微任务依赖于宏任务存在,在宏任务执行完成后执行 参考宏任务和微任务1 参考宏任务和微任务2 宏任务和微任务
高阶组件、react 高阶组件;
Higher-Order Component 一个传入一个组件,返回另一个组件的函数,其概念与高阶函数的将函数作为参数传入类似 高阶组件是一个接替Mixin实现抽象组件公共功能的方法,高阶组件其实是一个函数,接收一个组件作为参数,返回一个包装组件作为返回值
- 代码复用:这是高阶组件最基本的功能。组件是React中最小单元,两个相似度很高的组件通过将组件重复部分抽取出来,再通过高阶组件扩展,增删改props,dom 可达到组件可复用的目的;
- 条件渲染:控制组件的渲染逻辑,常见case:鉴权;优化渲染
- 生命周期捕获/劫持:借助父组件子组件生命周期规则捕获子组件的生命周期,常见case:打点。
不可变数据类型的概念,是否知道具体使用
当数据类型的对应变量的值发生了改变,那么他对应的内存地址也会发生改变,
对于这种数据类型就是不可变数据类型
比如:number、string、boolean、undefined、null、symbol
资源放cdn的原因,cdn优化资源
- cdn: CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。
当我们的项目放在单独的项目服务器上时,用户访问页面时,资源都是从项目的服务器上加载,这样网速和带宽都会受到限制,速度回变得很慢,如果资源放在cdn上,cdn会在不同的地方部署,当用户访问我们的网站应用的时候,可以从就近的cdn上去下载资源,这样用户的访问速度就会大大提升
回流和重绘, 如何 缓解 回流
- 回流:当渲染树中的一部分或者全部应为元素的尺寸、布局、隐藏等改变而需要重新构建的时候,这时就会发生回流
- 重绘:在回流的时候浏览器会使渲染树中受到影响的元素部分失效,并重新绘制这个部分的渲染树,完成回流后浏览器重新绘制受到影响的部分元素到屏幕中,这个过程就是重绘
-
缓解重绘的方法:
-
- CSS中的定位、隐藏:如果经常需要复杂的操作的地方,可以使用position:absoulute/fixed定位;或者display:none使之脱离文档流后操作
- Css中的触发回流属性如:offsetTop、offsetLeft、 offsetWidth、offsetHeight;scrollTop、scrollLeft、scrollWidth、scrollHeight;clientTop、clientLeft、clientWidth、clientHeight;getComputedStyle() 、currentStyle(),这种属性只要改动了他们的值,就会触发回流,所以尽量将他们合并在一起操作
- Js控制样式的class而不修改具体的样式,因为浏览器每修改一个具体的样式就会进行一次重绘,如果修改了特定的属性还会发生回流
- Js添加多个元素,将元素的操作集合在一个方法之内
js 数据类型,如何判断
-
值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、唯一Symbol()。
-
引用数据类型:对象(Object)、数组(Array)、函数(Function)。
-
如何判断
- 1、typeof 返回数据类型,包含这7种: number、boolean、symbol、string、object、undefined、function。 typeof null 返回类型错误,返回object 引用类型,除了function返回function类型外,其他均返回object。 其中,null 有属于自己的数据类型 Null , 引用类型中的 数组、日期、正则 也都有属于自己的具体类型,而 typeof 对于这些类型的处理,只返回了处于其原型链最顶端的 Object 类型,没有错,但不是我们想要的结果。
- 2 toString 这个是最完美的 toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]] 。这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型。 对于 Object 对象,直接调用 toString() 就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。 Object.prototype.toString.call('') ; // [object String] Object.prototype.toString.call(1) ; // [object Number] Object.prototype.toString.call(true) ; // [object Boolean] Object.prototype.toString.call(Symbol()); //[object Symbol] Object.prototype.toString.call(undefined) ; // [object Undefined] Object.prototype.toString.call(null) ; // [object Null] Object.prototype.toString.call(new Function()) ; // [object Function] Object.prototype.toString.call(new Date()) ; // [object Date] Object.prototype.toString.call([]) ; // [object Array] Object.prototype.toString.call(new RegExp()) ; // [object RegExp] Object.prototype.toString.call(new Error()) ; // [object Error] Object.prototype.toString.call(document) ; // [object HTMLDocument] Object.prototype.toString.call(window) ; //[object global] window 是全局对象 global 的引用
fetch数据如何 请求拦截 和响应拦截
- todo
axios数据请求 使用 ,如何请求拦截和响应 拦截
mounted:function(){
axios.interceptors.request.use(function(config){
console.log('请求前')
return config;
})
axios.interceptors.response.use(function(response){
console.log('请求后')
return response;
})
},
深浅拷贝理解得如何,项目中是否使用过 深拷贝
- 应用场景: 深拷贝和浅拷贝一般针对引用类型的数据,如果对象、数组;因为引用类型的数据字面量保存的是数据的指针,
- 所以当浅拷贝时只是把数据的指针赋值给了新的数据字面量,当进行数据操作时会影响到原始的数据,因为指针指向的还是原始的数据。
- 深拷贝是在内存里面重新开辟内存空间吧原有的数据内容保存过来,字面量保存指向此数据的指针
- 如何实现:
let deepClone = JSON.parse(JSON.stringify(obj))
//使用递归的方式实现数组、对象的深拷贝
function deepClone1(obj) {
//判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝
var objClone = Array.isArray(obj) ? [] : {};
//进行深拷贝的不能为空,并且是对象或者是
if (obj && typeof obj === "object") {
for (key in obj) {
if (obj.hasOwnProperty(key)) {
if (obj[key] && typeof obj[key] === "object") {
objClone[key] = deepClone1(obj[key]);
} else {
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
深拷贝
var array = [1,2,3,4];
var newArray = $.extend(true,[],array);
一级为深拷贝,如果是多级的话就是浅拷贝
Object.assign()
lodash很热门的函数库,提供了 lodash.cloneDeep()实现深拷贝