这篇文章并非最全的前端口试题(没有最全,只要更全),只是针对本身口试过程当中碰到的一些困难、轻易疏忽的题做一个简朴的笔记,轻易背面有口试须要的小伙伴们自创,后续内容会不定时更新,有毛病的地方愿望人人不吝指出。
1、JS耽误加载的体式格局有哪些?
- defer和async
- 动态建立DOM体式格局(建立script,插进去到DOM中,加载终了后callBack)
- 按需异步载入js
2、前端跨域解决方案概况
3、怎样完成浅拷贝和深拷贝
- 浅拷贝:
- 直接经由过程=赋值
let data = {n: 1};
let cloneData = data;
cloneData.n = 2;
console.log(data.n) // 2
- 假如obj对象有多个层级,能够经由过程Object.assign()
let data = {name: {firstName: 'lsh'}};
let cloneData = Object.assign({}, data);
cloneData.name.firstName = 'lx';
console.log(data.name.firstName) // lx
- 深拷贝
- 简朴的经由过程JSON.parse(JSON.stringify(data))
- 经由过程lodash.js
let cloneData = lodash.cloneDeep(data);
- 假如obj对象只要一级,能够用Object.assign();
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;
}
- 经由过程Object.create()要领
let data = {n: 1};
let cloneData = Object.create(data);
console.log(cloneData); // {}
console.log(cloneData.n); // 1
console.log(cloneData.__proto__); // {n: 1}
- 经由过程$.extend()要领
let data = {t: 1};
let cloneData = $.extend(true, {}, data, {t: 2});
cloneData.t = 3;
console.log(data.t) // 1
4、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([]);
})
5、js中运用new操作符详细做了哪些事变?
let obj = new Base();
建立了一个空对象obj;
let obj = {};
空对象obj的__proto__属性指向组织函数Base的prototype属性;
obj.__proto__ = Base.prototype;
实行组织函数,将Base的this指向obj;
Base.call(obj);