前端面试手撕代码题目

instanceof源码实现

<script>
			/*instanceof是通过原型链来实现判断的,
			只要判断实例化的原型是不是
			指向Array或者Object对象的原型就可以
			注意的一点是:只能判断Object类型的*/
			
			function instanceof1(a,b){
				let aPro=a.__proto__;
				let bPro=b.prototype;
				if(aPro===null){
					return false;
				} 
				while(true){
					if(aPro===bPro){
						return true;
					}
					aPro=aPro.__proto__;
				}
			}
		   // function A(){
			  //  this.name='11'
			   
		   // }
		   // var a=new A();
		   var a =new Array();
			console.log(instanceof1(a,Array); //true
		</script>

驼峰命名转化

<script>
			function trans(str){
				var arr=str.split('-');
				var newArr=arr[0];
				for(let i=1;i<arr.length;i++){
					//concat()实现字符串拼接或者数组拼接,slice()实现字符串的截取
					var a=arr[i][0].toUpperCase().concat(arr[i].slice(1));
					newArr=newArr.concat(a);
				}
				return newArr;
				
			}
			var a=trans('arf-hhd');
			console.log(a);  //arfHhd
			2.使用正则表达式进行匹配特定字符串
			function trans(str){
				var arr=str.split(/\-\@/g);
				var newArr=arr[0];
				console.log(arr);
				// for(let i=1;i<arr.length;i++){
				// 	//concat()实现字符串拼接或者数组拼接,slice()实现字符串的截取
				// 	var a=arr[i][0].toUpperCase().concat(arr[i].slice(1));
				// 	newArr=newArr.concat(a);
				// }
				// return newArr;
				
			}
			trans('arf-@hhd'); //arfHhd
			
		</script>

css三列布局,中间自适应

js实现拖拽效果

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			#app{
				width: 100px;
				height: 100px;
				background-color: red;
				position: absolute;
			}
		</style>
	</head>
	<body>
		<div id="app"></div>
		<script>
			var app=document.getElementById("app");
			//拖拽主要是鼠标按下、鼠标移动、鼠标弹起三个事件
			//鼠标移动过程中不断改变盒子的left  top就可以实现跟随鼠标拖拽
			app.onmousedown=function(){
				
				document.onmousemove=function(event){
					e=event||window.event;
					var left=e.clientX;
					var top=e.clientY;
					app.style.left=left+"px";
					app.style.top=top+"px";
				}
				document.onmouseup=function(){
					//鼠标松开将移动事件取消
					document.onmousemove=null;
				}
			}
		</script>
	</body>
</html>

toLowerCase函数实现

<script>
			//原理就是大小写之间的unicode编码差距是32,比如A65,a97
			function toLowerCase1(str){
				var strArr=str.split('');
				var uniCode;
				let maxuniCode='Z'.charCodeAt();
				let minuniCode='A'.charCodeAt();
				for(let i=0;i<strArr.length;i++){
					uniCode=strArr[i].charCodeAt();
					//判断是否是大写字母,如果是就转变成小写
					if(uniCode>=minuniCode&&uniCode<=maxuniCode){
						strArr[i]=String.fromCharCode(uniCode+32);
					}
				}
				return strArr.join('');
				
			}
			var re=toLowerCase1("SSDDDxc");
			console.log(re);
		</script>

toUpperCase函数实现

<script type="text/javascript">
			//toUpperCase也是使用的unicode编码实现
			//大写字母比小写字母小32
			function toUpperCase1(str){
				var uniCode;
				var maxuniCode='z'.charCodeAt();
				var minuniCode='a'.charCodeAt();
				var strArr=str.split('');
				for(let i=0;i<strArr.length;i++){
					//判断如果是小写字母就替换成大写
					uniCode=strArr[i].charCodeAt();
					if(uniCode>=minuniCode&&uniCode<=maxuniCode){
						strArr[i]=String.fromCharCode(uniCode-32);
					}
				}
				return strArr.join('');
			}
			var strUpper=toUpperCase1('aaaQQWdd');
			console.log(strUpper);
		</script>

获取字符串的最大值和最小值

<script>
			var arr=[1,10,2,45,3,0];
			// console.log(arr.sort());
			//输出的是[0,1,10,2,3,45]因为sort是根据unicode进行排序的
			//如果是要对number进行排序,需要在sort中输入一个函数,指定是从大到小还是从小到大
			// var arr2=arr.sort(function(a,b){return a-b});  //[45,10,3,2,1,0]
			var arr3=arr.sort(function(a,b){return a-b});  //[0,1,2,3,10,45]
			// console.log(arr2);
			console.log(arr3);
		</script>

事件委托

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div>
			<ul id="main">
				<li>1</li>
				<li>2</li>
				<li>3</li>
			</ul>
		</div>
		<script>
			/*
			事件委托:
			之前在网上看到的一个例子就是描述的是事件委托,我觉得很形象
			一个宿舍四个人如果都有快递要拿,那我们应该是要四个人都去门口在等着
			但是我们可以拜托我们的宿舍管理员去拿,只需要一个人就去就行,所以事件委托
			跟这个很像
			事件委托就是将事件绑定在父级元素上,让父级元素负责监听自己元素的事件
			使用的原理就是事件冒泡,比如div>ul>li>a,a的点击事件会向外传播,a-li-ul-div
			所以a的点击事件会冒泡到div上,如果想要实现跟本来一样的效果,比如,每个li的点击
			事件,这又涉及到要使用event对象中的target属性,这个属性可以提供事件源
			通过属性中事件源的nodeName可以进行if判断,但是这个属性有兼容,一般浏览器是
			event.target但是ie浏览器是event.srcElement
			
			
			
			
			*/
			// 1. 原始每个li设置click事件
			// var lis=document.getElementsByTagName("li");
			// var ul=document.getElementById("main");
			// for(let i=0;i<lis.length;i++){
			// 	lis[i].onclick=function(){
			// 		console.log(i);
			// 	}	
			// }
			//不使用事件委托的话,原始的里边如果要动态添加一个节点
			//不会绑定事件,但是如果使用事件委托的话就可以绑定
			// var newli=document.createElement("li");
			// newli.innerHTML="4";
			// ul.appendChild(newli);
			//2. 事件委托实现
			var lis=document.getElementsByTagName("li");
			var ul=document.getElementById("main");
			ul.onclick=function(ev){
				var ev=ev||window.event;
				//事件委托如果想要是实现跟之前一样的效果就是点击li才进行操作
				//event提供了一个target属性用来返回事件源,这个有兼容性问题
				//IE是event.srcElement,其余浏览器是event.target,通过nodeName节点名字可以实现点击
				var target=ev.target||ev.srcElement;
				if(target.nodeName.toLowerCase()=="li"){
					console.log(target.innerHTML);
				}
			}
			
			
		</script>
	</body>
</html>

数组去重

<script type="text/javascript">
			var arr=[1,1,2,3,4,5,5,6];
			//1.使用ES6的语法,Set,Array.from用于将一个伪数组转变成一个真正的数组
			//[...]就是将转化成数组
			// var arr1=Array.from(new Set(arr));
			// var arr2=[...new Set(arr)];
			
			//2.arr.indexof(arr[0])返回的是arr[0]在arr中首次出现的位置,如果没有就返回-1
			function unique(arr){
				var arr2=[];
				for(let i=0;i<arr.length;i++){
					if(arr2.indexOf(arr[i])==-1){
						arr2.push(arr[i]);
					}
				}
				return arr2;
			}
			console.log(unique(arr));
			
			
			
		</script>

防抖与节流

//防抖
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			#box{
				width: 200px;
				height: 200px;
				background-color: black;
			}
		</style>
	</head>
	<body>
		<div id="box"></div>
		<!-- 防抖与节流都是前端性能优化的一种手段 -->
		<!-- ajax的请求数据、提交数据、输入验证 -->
		<script>
			var num=0;
			var box=document.getElementById("box");
			function fun(e){
				num++;
				console.log(num);
				// console.log(this);window
				console.log(this);
				console.log(e);
				return "fun";
			}	
			// 防抖:1. 延时 2.this指向问题 3. event参数 4. 是否立即执行
			function debounce(fun,waitTime,immdeate){
				let time=null;
				let result;
				let debounced=function(){
					// 防抖的操作
						clearTimeout(time);
						// console.log(this);当前的对象id=box,因为是谁调用就指向谁
						//多以需要改变this的指向问题使用appy
						let context=this;
						let arg=arguments;
						if(immdeate){
							// 立即执行
							let callnow=!time;
							time=setTimeout(function(){
								time=null;
							},waitTime);
							if(callnow){
								result=fun.apply(context,arg);
							}
						}else{
							// 非立即执行
							time=setTimeout(function(){
								result=fun.apply(context,arg);
							},waitTime);
						}
						return result;
				}
				//取消防抖
				debounced.cancel=function(){
					clearTimeout(time);
					time=null;
				}
				return debounced;
			}
			// box.addEventListener("click",debounce(fun,3000));
			box.onmouseenter=debounce(fun,1000,true);
			
		
		</script>
		
	</body>
</html>
//节流
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			#app{
				width: 200px;
				height: 200px;
				background-color: #000000;
			}
		</style>
	</head>
	<body>
		<!-- 节流:如果持续触发事件,每隔一段时间才触发一次 -->
		<div id="app"></div>
		<script>
			var app=document.getElementById("app");
			var num=0;
			function fun(e){
				num++;
				console.log(num);
			}
			// 节流函数:时间戳+定时器
			function throttle(fun,wait,options){
				var old=0;
				var context,args,timeout;
				if(!options) options={};
				
				return function(){
					context=this;
					args=arguments;
					var now=new Date().valueOf();
					if(options.leading===false&&!old){
						old=now;
					}
					if(now-old>wait){
						//第一次执行
						fun.apply(context);
						old=now;
						timeout=null;
					}else if(!timeout&&options.traing!==false){
						timeout=setTimeout(fun,wait);
					}
				}
			}
			app.onmouseenter=throttle(fun,1000,{
				leading:false,
				traing:true,
				// 第一个是true代表第一次输出,第二个是false代表最后一次不输出
				//可以 true true,true false,false true,但是不能 false false
				
			});
		</script>
	</body>
</html>

常见JS内置错误

<script>
			//1. TypeError类型错误
			// var a=null;
			// console.log(a.xx);
			//2.RangeError范围错误
			// function add(){
			// 	add();
			// }
			// add();
			//3.SyntaxError语法错误
			// var str="""";
			//4.ReferenceError引用错误
			console.log(a);
			
		</script>

猜你喜欢

转载自blog.csdn.net/weixin_43797908/article/details/108352103