前端基础知识
1.深拷贝与浅拷贝的区别
浅拷贝是指创建一个对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,那么拷贝的就是基本类型的值,如果属性是引用类型,那么拷贝的就是内存地址,所以如果其中一个对象修改了某些属性,那么另一个对象就会受到影响。
深拷贝是指从内存中完整地拷贝一个对象出来,并在堆内存中为其分配一个新的内存区域来存放,并且修改该对象的属性不会影响到原来的对象。
2.深拷贝与浅拷贝的实现方式
浅拷贝:(1) Object.assign的方式 (2) 通过对象扩展运算符 (3) 通过数组的slice方法 (4) 通过数组的concat方法。
深拷贝:(1) 通过JSON.stringify来序列化对象 (2) 手动实现递归的方式。
3.简述无缝轮播的实现思路
多张图片从左至右依次排列,点击左右侧按钮切换图片的时候,让图片的父级容器的left偏移值增加或减少单张图片的宽度大小,同时配合CSS3 transition过渡或者手写一个动画函数,这样可以实现一个比较平滑的动画效果。对于无缝轮播,我当时的思路是再拷贝一个图片的父级容器出来,例如原来一个<ul><li></li><li></li></ul>对应两张图片,现在变为两个ul对应4张图片,同时ul的父容器监听自身的scrollLeft,如果值已经大于等于一个ul的宽度,则立即将自身的scrollLeft值重置为0,这样就又可以从起点开始轮播,实现无缝的效果。
4.前端性能优化方案
这个其实方案还是比较多的,可以从DOM层面,CSS样式层面和JS逻辑层面分别入手,大概给出以下几种:
(1) 减少DOM的访问次数,可以将DOM缓存到变量中;
(2) 减少重绘和回流,任何会导致重绘和回流的操作都应减少执行,可将多次操作合并为一次;
(3) 尽量采用事件委托的方式进行事件绑定,避免大量绑定导致内存占用过多;
(4) css层级尽量扁平化,避免过多的层级嵌套,尽量使用特定的选择器来区分;
(5) 动画尽量使用CSS3动画属性来实现,开启GPU硬件加速;
(6) 图片在加载前提前指定宽高或者脱离文档流,可避免加载后的重新计算导致的页面回流;
(7) css文件在<head>标签中引入,js文件在<body>标签中引入,优化关键渲染路径;
(8) 加速或者减少HTTP请求,使用CDN加载静态资源,合理使用浏览器强缓存和协商缓存,小图片可以使用Base64来代替,合理使用浏览器的预取指令prefetch和预加载指令preload;
(9) 压缩混淆代码,删除无用代码,代码拆分来减少文件体积;
(10) 小图片使用雪碧图,图片选择合适的质量、尺寸和格式,避免流量浪费。
5.git多人协作时如何解决冲突
冲突主要是出现在多人在修改同一个文件的同一部分内容时,对方当你之前push,然后你后push的时候git检测到两次提交内容不匹配,提示你Conflict,然后你pull下来的代码会在冲突的地方使用=====隔开,此时你需要找到对应的开发人员商量代码的取舍,切不可随意修改并强制提交,解决冲突后再次push即可。
6.JS中==与===的区别。
==表示抽象相等,两边值类型不同的时候,会先做隐式类型转换,再对值进行比较; ===表示严格相等,不会做类型转换,两边的类型不同一定不相等。
7.冒泡排序
简单实现,代码如下:
//冒泡排序 从大到小 function sort(arr){ // 一共几个数就循环几回 for(var i = 0; i < arr.length; i++){ // 一回要比较多少次 for(var j = 0; j < arr.length - i; j++){ if(arr[j] < arr[j+1]){ var temp; //声明一个临时变量帮助交换两个数 temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } return arr; }

浙公网安备 33010602011771号