栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > Web开发 > React.JS

曾经面试踩过的坑,都在这里了~JS

React.JS 更新时间:发布时间: 百科书网 趣学号

Javascript

1、请将下列b函数进行修改,保证每次调用a都能+1(考闭包):
//本文由IT@IT·平头哥联盟-首席填坑官∙苏南分享,如有错误,欢迎留言
function b(){
	var a=1;
};

function b(){
	var a=1;
	return ()=>{
		a++;
		return a;
	}
};
let c = b();
c(); //2
c(); //3
c(); //4

####### 2、js有哪些基本数据类型:
ECMAScript 标准定义有7种数据类型:

  • Boolean
  • Null
  • Undefined
  • Number
  • String
  • Symbol :(ECMAScript 6 新定义 ,Symbol 生成一个全局唯一、表示独一无二的值)
  • Object :(Array、Function、Object)
3、用js将 386485473.88 转换为 386,485,473.88(千位分割符):
//方法1:
var separator=(num)=>{
	if(!num){
		return '0.00';
	};
	let str = parseFloat(num).toFixed(2);
	return str && str
		.toString()
		.replace(/(d)(?=(d{3})+.)/g, function($0, $1) {
			return $1 + ",";
		});
}

separator(386485473.88) //"386,485,473.88"

//方法2:
(386485473.88).toLocaleString('en-US')  // "386,485,473.88" 由 (sRect)补充

4、js的 for 跟for in 循环它们之间的区别?
  • 遍历数组时的异同: for循环 数组下标的typeof类型:number, for in 循环数组下标的typeof类型:string;
var southSu = ['苏南','深圳','18','男'];
for(var i=0;i
  • 遍历对象时的异同:for循环 无法用于循环对象,获取不到obj.length; for in 循环遍历对象的属性时,原型链上的所有属性都将被访问,解决方案:使用hasOwnProperty方法过滤或Object.keys会返回自身可枚举属性组成的数组
Object.prototype.test = '原型链上的属性,本文由@IT·平头哥联盟-首席填坑官∙苏南分享';
var southSu = {name:'苏南',address:'深圳',age:18,sex:'男',height:176};
for(var i=0;i
5、给table表格中的每个td绑定事件,td数量为1000+,写一下你的思路(事件委托题):

	
		…………
	
我们是@IT·平头哥联盟,我是首席填坑官苏南前端开发优秀
我们是@IT·平头哥联盟,我是首席填坑官苏南前端开发优秀
我们是@IT·平头哥联盟,我是首席填坑官苏南前端开发优秀
6、js把一串字符串去重(能统计出字符重复次数更佳),列出你的思路(两种以上):


7、项目上线前,你们做过哪些性能优化:
  • 图片预加载,css样式表放在顶部且link链式引入,javascript放在底部body结束标签前;
  • 使用dns-prefetch对项目中用到的域名进行 DNS 预解析,减少 DNS 查询,如: ;
  • 减少http请求次数:图片静态资源使用CDN托管;
  • API接口数据设置缓存,CSS Sprites/SVG Sprites(如有疑惑:该如何以正确的姿势插入SVG Sprites? 这篇说的很详细), JS、CSS源码压缩、图片大小控制合适,使用iconfont(+ 字体图标)或SVG,它们比图片更小更清晰,网页Gzip压缩;
  • 减少DOM操作次数,优化javascript性能;
  • 减少 DOM 元素数量,合理利用:after、:before等伪类;
  • 避免重定向、图片懒加载;前后端分离开发,资源按需加载,最好能做到首屏直出(即服务端渲染);
  • 避免使用CSS Expression(css表达式)又称Dynamic properties(动态属性) ;
  • 多域名分发划分内容到不同域名,解决浏览器域名请求并发数问题,同时也解决了请求默认携带的cookie问题;
  • 尽量减少 iframe 使用,它会阻塞主页面的渲染; 对所有资源压缩 JavaScript 、 CSS 、字体、图片等,甚至html;
  • 只想到这些,欢迎补充……
8、你对重绘、重排的理解?
  • 首先网页数次渲染生成时,这个可称为重排;
  • 修改DOM、样式表、用户事件或行为(鼠标悬停、页面滚动、输入框键入文字、改变窗口大小等等)这些都会导致页面重新渲染,那么重新渲染,就需要重新生成布局和重新绘制节点,前者叫做"重排",后者"重绘";
  • 减少或集中对页面的操作,即多次操作集中在一起执行;
  • 总之可以简单总结为:重绘不一定会重排,但重排必然为会重绘。
  • 更详细的可以看阮老师分析
8、有用过promise吗?请写出下列代码的执行结果,并写出你的理解思路:
setTimeout(()=>{
		console.log(1);
}, 0);

new Promise((resolve)=>{
		console.log(2);//首席填坑官∙苏南的专栏,QQ:912594095
		for(var i = 1; i < 200; i++){
				i = 198 && resolve();
		}
		console.log(3);
}).then(()=>{
		console.log(4);
});
console.log(5);

// 结果:2、3、5、4、1;
  • 首先要讲一下,js是单线程执行,那么代码的执行就有先后;
  • 有先后,那就要有规则(排队),不然就乱套了,那么如何分先后呢?大体分两种:同步、异步;
  • 同步很好理解,就不用多说了(我就是老大,你们都要给我让路);
  • 异步(定时器[setTimeout ,setInterval]、事件、ajax、promise等),说到异步又要细分宏任务、微任务两种机制,
  • 宏任务:js异步执行过程中遇到宏任务,就先执行宏任务,将宏任务加入执行的队列(event queue),然后再去执行微任务;
  • 微任务:js异步执行过程中遇到微任务,也会将任务加入执行的队列(event queue),但是注意这两个queue身份是不一样的,不是你先进来,就你先出去的(就像宫里的皇上选妃侍寝一样,不是你先进宫(或先来排队)就先宠幸的 ),真执行的时候是先微任务里拿对应回调函数,然后才轮到宏任务的队列回调执行的;
  • 理解了这个顺序,那上面的结果也就不难懂了。

说细步骤如下:
setTimeout 是异步,不会立即执行,加入执行队列;
new Promise 会立即执行 输出 2、3,而在2、3之间执行了resolve 也就是微任务;
再到console.log(5)了,输出5;
然后异步里的微任务先出,那就得到4;
最后执行宏任务 setTimeout 输出 1;
如有错误欢迎纠正!

9、new SouthSu() 在这个过程中都做了些什么?
function SouthSu(){
 		this.name = "苏南";
 		this.age = 18;
 		this.address = "深圳";
 		this.address = "首席填坑官";
};

 let South = new SouthSu();
 console.log(South,South.__proto__ === SouthSu.prototype) //true 

执行过程:
创建一个空的对象
 let p1 = new Object();


设置原型链
	p1.__proto__ = SouthSu.prototype;

让 构造函数 的this 指向 p1 这个空对象

	let funCall = SouthSu.call(p1);

处理 构造函数 的返回值:判断SouthSu的返回值类型,如果是值类型则返回obj,如果是引用类型,就返回这个引用类型的对象;

10、工作中如果让你使用js实现一个持续的动画,你会怎么做(比如转盘抽奖)??
  • js来实现动画,第一时间想到的就是定时器(setTimeout、setInterval);
  • 后面想起来js有个 window.requestAnimationFrame ,当时只是说了记得有这么一个API,具体的细节没能答上,面试官直言想听的就是这个API的使用,好吧是我准备的不够充分,希望其他同学不再犯同样错误;

window.requestAnimationFrame() 方法告诉浏览器您希望执行动画并请求浏览器在下一次重绘之前调用指定的函数来更新动画。该方法使用一个回调函数作为参数,这个回调函数会在浏览器重绘之前调用,回调的次数通常是每秒60次,是大多数浏览器通常匹配 W3C 所建议的刷新频率。在大多数浏览器里,当运行在后台标签页或者隐藏的