手撕面试题

138 阅读1分钟
//new实现
function myNew(con, ...args) {
	if (typeof con !== 'function') {
		throw '第一个参数必须是函数'
	}
	let obj = {}
	obj.__proto__ = con.prototype
	let result = con.apply(obj, args)
	return typeof res === 'object' ? res || obj : obj
}
//ajax实现
function ajax(url, successFn) {
	let xhr = new XMLHttpRequest();
	xhr.open('GET', url, false)
	xhr.onreadystatechange = function() {
		if (xhr.readyState === 4) {
			if (xhr.status === 200) {
				successFn(xhr.response)
			}
		}
	}
	xhr.send(null)
}
//节流
function debounce(fn, delay) {
	let timer = 0;
	return function() {
		if (timer) return
		timer = setTimeout(() => {
			fn.apply(this, arguments)
			timer = 0
		}, delay);
	}
}
//防抖
function debounce(fn, delay) {
	let timer = 0;
	return function() {
		if (timer) clearTimeout(timer) timer = setTimeout(() => {
			fn.apply(this, arguments) timer = 0
		}, delay);
	}
}
//px,em,rem,%
px是固定的像素, 一旦设置了就无法因为适应页面大小而改变。 em和rem相对于px更具有灵活性, 他们是相对长度单位, 意思是长度不是定死了的, 更适用于响应式布局。 对于em和rem的区别一句话概括: em相对于父元素, rem相对于根元素。
//箭头函数
箭头函数没有arguments, 箭头函数不能通过apply, bind, call来改变this。 箭头函数this指向定义时的父作用鱼
箭头函数不适合的场景: 1 构造函数2原型方法3对象的方法
//for in 和for of
forin显示key, forof显示value
let arr = [12, 13, 14]
for (let i in arr) {
	console.log(i)
} //0 1 2
for (let i of arr) {
	console.log(i)
} //12 13 14
//前端统计sdk
访问量pv,自定义事件,性能,错误
//你有什么不足,请说一下
一定要聊技术,说自己不太熟悉的技术栈。然后反转,说我已经意识到并开始学习,我估计会在一段时间内补齐短板。
//code review
代码规范(变量命名,代码语义),重复代码抽离复用,单个函数内容过长,需要拆分。算法复杂度能否优化
,是否有安全漏洞,扩展性怎么样,组件设计是否合理,