前端面试题总结

1、JS的数据类型只有浮点型,没有整型。
null,underfined,boolean,number,string,symbol
typeof对于基本数据类型,除了null都能正常表达其类型。
2、隐式类型转换
underfined,null,false,NaN,'',0 为false
其它为true
3、调用new 操作执行哪些步骤:
1.新生成了一个对象,
2.链接到原型
3.绑定this
4.返回新对象
4、实例对象和构造函数之间的关系?
构造函数实例化产生实例
1.实例对象:
实例对象中只有proto属性,所有的实例都指向自己构造函数的原型。proto属性里面有构造器construction和proto
构造器指向原型所属的构造函数,proto属性指向Object的原型。
2.构造函数:
构造函数里面有俩个属性proto和prototype属性,原型属性prototype本质上该属性就是对象(Object的实例对象)。proto指向Function。
5、如何判断对象是不是这个数据类型
1.通过构造器的方式,实例对象的构造器constructor==构造函数名字
2.instanceof构造函数的名字(instanceof可以正确的判断对象的类型,因为内部机制是通过判断对象的原型链中是不是能找到类型的 prototype)
6、原型的作用:
1.解决数据共享,节省内存空间
2.不需要共享的函数写在构造函数里,需要共享的数据写在原型里(感觉像废话)
7、闭包方面,为什么函数A已经弹栈了,为什么函数B还能引用函数A中的变量?
答:因为函数A中的变量这时候已经存储在堆中,现在JS引擎可以通过逃逸分析辨别出哪些变量需要存储在堆上,哪些需要存储在栈上。
*闭包的常用场景:轮播图、模块就是闭包
8、CommonJS和ES6中的模块化的两者区别:
1.前者支持动态导入,也就是 require(${path}/xx.js),后者目前不支持,但是已有提案
2.前者是同步导入,因为用于服务端,文件都在本地,同步导入即使卡住主线程影响也不大。而后者是异步导入,因为用于浏览器,需要下载文件,如果也采用导入会对渲染有很大影响
3.前者在导出时都是值拷贝,就算导出的值变了,导入的值也不会改变,所以如果想更新值,必须重新导入一次。但是后者采用实时绑定的方式,导入导出的值都指向同一个内存地址,所以导入值会跟随导出值变化
4.后者会编译成 require/exports 来执行的

9、函数防抖:
1.如果在频繁的事件回调中做复杂计算,很有可能导致页面卡顿,不如将多次计算合并为一次计算,只在一个精确点做操作,可以实现一个按钮的防二次点击操作。
2.函数防抖的实现思路:
一旦我开始一个定时器,只要我定时器还在,不管你怎么点击都不会执行回调函数。一旦定时器结束并设置为 null,就可以再次点击了。
3.函数节流:
防抖动和节流本质是不一样的。防抖动是将多次执行变为最后一次执行,节流是将多次执行变成每隔一段时间执行。
10、call,apply,bind区别:
1.call、apply和bind是Function对象自带的三个方法,都是为了改变函数体内部 this 的指向。
2.apply 、 call 、bind 三者第一个参数都是 this 要指向的对象,也就是想指定的上下文;
3.apply 、 call 、bind 三者都可以利用后续参数传参;
4.bind 是返回对应 函数,便于稍后调用bind() 方法会创建一个 新函数,称为绑定函数,当调用这个绑定函数时,绑定函数会以创建它时传入 bind() 方法的第一个参数 作为 this,传入 bind() 方法的 第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。
5.apply 、call 则是立即调用 。
对于 apply、call 二者而言,作用完全一样,只是接受 参数 的方式不太一样。call 是把参数按顺序传递进去,而 apply 则是把参数放在数组里。
11、V8 下的垃圾回收机制:
1.V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制。因此,V8 将内存(堆)分为新生代和老生代两部分。
2.新生代算法:新生代中的对象一般存活时间较短,使用 Scavenge GC 算法。
3.老生代算法:老生代中的对象一般存活时间较长且数量也多,使用了两个算法,分别是标记清除算法和标记压缩算法。
12、跨域:
1.因为浏览器出于安全考虑,有同源策略。也就是说,如果协议、域名或者端口有一个不同就是跨域,Ajax 请求会失败。
2.JSONP:
JSONP 的原理很简单,就是利用

你可能感兴趣的:(前端面试题总结)