前端知识梳理与总结(三)--面试常见问题

1.箭头和普通函数的区别、箭头和匿名函数的区别

  • 普通函数可以用于构造函数,而箭头函数不能用于构造函数

  • 箭头函数中this的指向不同:在普通函数中,this总是指向调用它的对象或者,如果用作构造函数,它指向创建的对象实例。

  • 箭头函数本身没有this,但是在它声明时可以捕获它所在作用域中的this供自己使用。 bind()、call()、apply()均无法改变指向。

  • 箭头函数全都是匿名函数,箭头函数没有变量提升。

  • 匿名函数的执行环境是全局性的,this指向window。

2.ES5的继承和ES6 class的继承的区别
在这里插入图片描述

3.js的垃圾回收机制
在这里插入图片描述

4.AMD和CommonJS的区别

  • AMD:异步加载所需模块,然后在回调函数中执行主逻辑,实现JS文件的异步加载,避免网页因加载时间过长而失去响应;
  • CMD在AMD基础上改进,可按需加载,预先下载代码,但并没有立即执行,即“就近书写,延迟执行”;
  • CommonJS规范不适用于浏览器环境,适用于服务端,因为所有的模块都存放在本地硬盘,可以同步加载完成,等待时间就是硬盘的读取时间;

5.首屏加载白屏的解决办法

  • 尽量不要首屏加载JS文件(由于<script>标签是阻塞解析的,将脚本放在网页尾部会加速代码渲染。)
  • 路由懒加载
  • 结合前端性能优化进行回答

6.虚拟DOM的原理
用JS操作DOM时,浏览器会从构建DOM树开始从头到尾执行一遍流程。操作真实DOM的代价是昂贵的,频繁操作还是会出现页面卡顿,影响用户体验。

虚拟DOM就是为了解决浏览器性能问题,是用JS对象模拟DOM节点,页面的更新可以先全部反映在JS对象(虚拟DOM)上,操作内存中的JS对象的速度显然要更快,等更新完成后,再将最终的JS对象映射成真实的DOM,交由浏览器去绘制。

7.generator,promise,async/await底层原理

  • Generator与async function都是返回一个特定类型的对象
  • Generator: 一个类似{ value: XXX, done: true }这样结构的Object
  • Async: 始终返回一个Promise,使用await或者.then()来获取返回值

8.HTTP1.0 和 HTTP1.1 的一些区别

  1. 长连接(TCP不断开)
  2. 缓存

9.ajax 的原生写法

var xhr = new XMLHttpRequest(); //创建异步对象
xhr.open("get","validate.php?username="+name);//设置请求行 open(请求方式,请求url)
xhr.send(null);//设置请求体 send()
xhr.onreadystatechange = function(){
if(xhr.status == 200 && xhr.readyState == 4){ 
	console.log(xhr.responseText); 
 }
}

10.性能优化

  • 减少请求次数:压缩文件 可用webpack打包工具
  • 图片采用懒加载
  • 使用外部CDN方法加载第三方插件
  • 代码方面的优化:
  • 减少dom的操作,主要是减少dom的重绘与回流
  • 把js脚本放在body的下面,防止阻塞加载
  • 合理使用缓存

11.JS的数据基本类型(ES6新增的)
凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。每个从Symbol()返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符;这是该数据类型仅有的目的。

let s = Symbol();
typeof s
// "symbol"
  • 每个Symbol变量都是独一无二的。
  • 当使用Symbol作为对象属性时,可以保证对象不会出现重名属性。

12.ES5的方式实现es6的Promise
在这里插入图片描述

//几个状态常量
const PENDING = 'pending';
const FULFILLED = 'fulfilled';
const REJECTED = 'rejected';
 
function MyPromise(callback) {
    this.status = PENDING; //储存状态
    this.__succ__res = null; //储存resolve结果
    this.__err__res = null; //储存reject结果
    var _this = this;//必须处理this的指向
    function resolver(res) {
        _this.status = FULFILLED;
        _this.__succ__res = res;
    };
    function rejecter(rej) {
        _this.status = REJECTED;
        _this.__err__res = rej;
    };
    callback(resolver, rejecter);
};
MyPromise.prototype.then = function(onFulfilled, onRejected) {
    if (this.status === FULFILLED) {
        onFulfilled(this.__succ__res);
    } else if (this.status === REJECTED) {
        onRejected(this.__err__res);
    };
};

13.webpack plugin和loader的区别

webpack做的就是分析代码,转换代码,编译代码,输出代码

plugin是一个扩展器,它丰富了webpack本身,针对是loader结束后,webpack打包的整个过程,它并不直接操作文件,而是基于事件机制工作,会监听webpack打包过程中的某些节点,执行广泛的任务。

loader 用于加载某些资源文件。因为 webpack 只能理解 JavaScript 和 JSON 文件,对于其他资源例如 css,图片,是没有办法加载的。 这就需要对应的loader将资源转化,加载进来。loader是用于加载的,它作用于一个个文件上。

14.js实现懒加载
页面渲染时将src路径放到自定义属性中去,这样页面加载时图片就不会去请求服务器,当图片滚动到可视区内时,获取它的自定义属性并赋值给src。

window.innerHeight:浏览器可视区域高度
document.body.scrollTop || document.documentElement.scrollTop:浏览器滚动条滚过高度
img.offsetTop:元素距文档顶部的高度

<script type="text/javascript">
	var imgs = document.querySelectorAll('img');
	window.onscroll = function(){
		var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
		var winTop = window.innerHeight;
		for(var i=0;i < imgs.length;i++){
		if(imgs[i].offsetTop < scrollTop + winTop ){ //加载条件
			imgs[i].src = imgs[i].getAttribute('data-src');
			}
		}
	}
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值