这篇文章并非最全的前端面试题(没有最全,只有更全),只是针对本身面试过程当中遇到的一些难题、容易忽略的题作一个简单的笔记,方便后面有面试须要的小伙伴们借鉴,后续内容会不定时更新,有错误之处但愿你们不吝指出。
一、JS延迟加载的方式有哪些?前端
二、前端跨域解决方案详情面试
三、如何实现浅拷贝和深拷贝segmentfault
let data = {n: 1}; let cloneData = data; cloneData.n = 2; console.log(data.n) // 2
let data = {name: {firstName: 'lsh'}}; let cloneData = Object.assign({}, data); cloneData.name.firstName = 'lx'; console.log(data.name.firstName) // lx
let cloneData = lodash.cloneDeep(data);
let data = {name: 'lsh'}; let cloneData = Object.assign({}, data); cloneData.name = 'lx'; console.log(data.name); // lsh
function cloneDeep(data) { if (!data || typeof data != "object") { return data; } let obj = data.constructor === Array ? [] : {}; for (let i in data) { obj[i] = typeof data[i] === 'object' ? cloneDeep(data[i]) : data[i] } return obj; }
let data = {n: 1}; let cloneData = Object.create(data); console.log(cloneData); // {} console.log(cloneData.n); // 1 console.log(cloneData.__proto__); // {n: 1}
let data = {t: 1}; let cloneData = $.extend(true, {}, data, {t: 2}); cloneData.t = 3; console.log(data.t) // 1
四、AMD、CMD、CommonJS之间区别
CommonJS:同步加载。必须等clock.js加载完成后才能调用start();跨域
const clock = reqiure('clock'); clock.start();
AMD(require.js):异步加载模块 => 依赖前置,提早执行。先定义依赖,加载完成后在回调函数中执行。浏览器
require(['clock', 'lodash'], function(clock, lodash)) { clock.start(); lodash.uniq(); }
CMD(sea.js):异步加载模块 => 依赖就近,延迟执行。性能优化
define(function(reqiure, exports, module) { var clock = require('clock'); clock.start(); var lodash = require('lodash'); lodash.uniq([]); })
五、js中使用new操做符具体作了哪些事情?异步
let obj = new Base();
建立了一个空对象obj;async
let obj = {};
空对象obj的__proto__属性指向构造函数Base的prototype属性;函数
obj.__proto__ = Base.prototype;
执行构造函数,将Base的this指向obj;性能
Base.call(obj);