本文不是最全的前端面试题(没有最全,只有更全),只是面试过程中遇到的几个比较难的问题,其中很容易被忽视。简单的笔记,方便后面需要面试的朋友。后续内容会不定时更新。希望大家指出错误。1、JS懒加载有哪些方法?defer和async动态创建DOM方法(创建脚本,插入DOM,加载后回调)按需异步加载js2,前端跨域解决详解3、如何实现浅拷贝和深拷贝浅拷贝:直接通过=赋值letdata={n:1};letcloneData=data;cloneData.n=2;console.log(data.n)//2如果obj对象有多个层次,可以使用Object.assign()letdata={name:{firstName:'lsh'}};letcloneData=Object.assign({},data);cloneData.name.firstName='lx';console.log(data.name.firstName)//lx深拷贝很简单通过JSON.parse(JSON.stringify(data))通过lodash.jsletcloneData=lodash.cloneDeep(data);如果obj对象只有一层,可以使用Object.assign();letdata={name:'lsh'};letcloneData=Object.assign({},data);cloneData.name='lx';控制台日志(数据名称);//lsh递归函数cloneDeep(data){if(!data||typeofdata!="object"){returndata;}让obj=data.constructor===数组?[]:{};for(letiindata){obj[i]=typeofdata[i]==='object'?cloneDeep(data[i]):data[i]}returnobj;}通过Object.create()方法letdata={n:1};letcloneData=Object.create(data);console.log(克隆数据);//{}console.log(cloneData.n);//1console.log(cloneData.__proto__);//{n:1}通过$.extend()方法letdata={t:1};letcloneData=$.extend(true,{},data,{t:2});cloneData.t=3;console.log(data.t)//14、AMD、CMD和CommonJS的区别CommonJS:同步加载必须等待clock.js加载完成后才能调用start();constclock=require('时钟');时钟开始();AMD(require.js):异步加载模块=>依赖前端,提前执行。先定义依赖,加载完成后在回调函数中执行。require(['clock','lodash'],function(clock,lodash)){clock.start();lodash.uniq();}CMD(sea.js):异步加载模块=>依赖最近的,延迟执行。define(function(reqiure,exports,module){varclock=require('clock');clock.start();varlodash=require('lodash');lodash.uniq([]);})5、jsnew操作符的用途具体是做什么的呢?让obj=newBase();创建了一个空对象obj;让对象={};空对象obj的__proto__属性指向构造函数Base的prototype属性;obj.__proto__=Base.prototype;执行构造函数,将Base的this指向obj;Base.call(obj);前端面试题与答案-浏览器篇前端面试题与答案-HTML篇前端面试题与答案-CSS篇
