手写面试题

1、实现new

function myNew(fn,...args){
	var instance = Object.create(fn.prototype)
	var result = fn.call(instance,...args)
	return typeof result==='object' ? result : instance
}

2、递归实现深拷贝

function deepClone(source){
	const targetObj = source.constructor === Array ? [] : {}
	for(let keys in source){
		if(source.hasOwnProperty(keys)){
			if(sourse[keys] && typeof source[keys] === 'object'){
				targetObj[keys] = source[keys].constructor === Array ? [] : {}
				targetObj[keys] = deepClone(source[keys])
			}else{
				targetObj[keys] = sourse[keys]
			}
		}
	}
	return targetObj
}

3、函数柯里化

function curry (fn){
	var outerargs = Array.prototype.slice.call(arguments,1)
	return function(){
		var innerargs = Array.prototype.slice.call(arguments)
		var finalargs = outerargs.concat(innerargs)
		return fn.apply(null,finalargs)
	}
}

4、XHR请求

let xhr = new XMLHttpRequest()
xhr.onreadystatechange = function(){
	if(xhr.readyState === 4 && xhr.status === 200){
		p.innerHTML = xhr.responseText
	}
}
xhr.open('post','/post-server')
xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
xhr.send('class=1234&style=你好')
-----------------------------------
xhr.open('get' , '/get-server?name=张三&age=20');
xhr.send();

5、jsonp

function jsonp({ url, params, callback }) {
  return new Promise((resolve, reject) => {
    let script = document.createElement('script')
    window[callback] = function(data) {
      resolve(data)
      document.body.removeChild(script)
    }
    params = { ...params, callback } // wd=b&callback=show
    let arrs = []
    for (let key in params) {
      arrs.push(`${key}=${params[key]}`)
    }
    script.src = `${url}?${arrs.join('&')}`
    document.body.appendChild(script)
  })
}
jsonp({
  url: 'http://localhost:3000/say',
  params: { wd: 'Iloveyou' },
  callback: 'show'
}).then(data => {
  console.log(data)
})

6、防抖

function debounce(fn,delay){
	let timer = null
	return function(){
		let that = this
		let args = arguments
		if(timer){
			clearTimerout(timer)
		}
		timer = setTimeout(() =>{
			fn.apply(that,args)
		},delay)
	}
}

7、节流

function throttle(fn , delay){
      let flag = true
	  
      return function(){
      	if(!flag )return
      	
        let that = this
        let args = arguments
        flag = false
        
        setTimeout(()=>{
        	fn.apply(that , args)
        	flag = true  //执行完函数 flag 是 true
        } , delay)
    }
}

8、call

Function.prototype.call = function (obj,...rest) {
        //判断第一个参数是否是null或者undefined,如果是使其指向window
      if(obj === null || obj === undefined) return this(...rest)
        //给指定的对象添加一个临时方法,方法的函数就是要改变指向的函数
      obj.temp = this
       //执行方法,改变原来函数体中this的指向
      const result = obj.temp(...rest)
       //删除添加的临时方法
      delete obj.temp
       //返回执行结果
      return result
    }
}

9、apply / bind

//call与apply的没有什么大的差异,只有接受实参的形参数据类型不同,call接受的数值数据,而apply接受的数组数据.
    Function.prototype.apply = function (obj,args) {
      if(obj === null || obj === undefined) return this(...args)
      obj.temp = this
      const result = obj.temp(...args)
      delete obj.temp
      return result 
    }

    //bind方法返回一个新函数,在新函数的内部利用call方法,调用了原来的函数,改变了this的指向.
    Function.prototype.bind = function (obj,...args) {
      const that = this
      return function (...args2) {
        return that.call (obj,...args,...args2)
      }
    }
}

10、寄生组合式继承

function Person(name){
	this.name = name
}
Person.prototype.sayName = function(){
	console.log("My name is " + this.name + ".");
}

function Student(name,age){
	Person.call(this,name)
	this.age = age
}
Student.prototype = object.create(Person.prototype)
Student.prototype.constructor = Student

Student.prototype.sayAge = function(){
	console.log("My age is " + this.age + ".");
}

11、instance of

function myInstanceof(left, right) {
  let prototype = right.prototype
  left = left.__proto__
  while (true) {
    if (left === null || left === undefined)
      return false
    if (prototype === left)
      return true
    left = left.__proto__
  }
}

12、数组去重

1、Set
var arr  = [1,1,'true','true',true,true,15,15,false,false, undefined,
undefined, null,null, NaN,NaN,'NaN', 0, 0, 'a', 'a',{},{}];
 
function arr_unique1(arr){
	return  [...new Set(arr)];
	//或者
	//return  Array.from(new Set(arr));
}
arr_unique1(arr);
2、forEach
function arr_unique4(arr){
	var res = [];
	arr.forEach((val,index)=>{
		if( res.indexOf(val) === -1 ){
			res.push(val);
		}
	});
	return res;
}

console.log(arr_unique4(arr));

13、数组扁平化:将多维数组转化成一维数组

function flatten(arr) {
    var res = [];
    arr.map(item => {
        if(Array.isArray(item)) {
            res = res.concat(flatten(item));
        } else {
            res.push(item);
        }
    });
    return res;
}
function flatten(arr) {  
    return arr.reduce((result, item)=> {
        return result.concat(Array.isArray(item) ? flatten(item) : item);
    }, []);
}
function flatten(arr) {
    while(arr.some(item=>Array.isArray(item))) {
        arr = [].concat(...arr);
    }
    return arr;
}

14、数组分块

function thunk(arr,size){
	let result = [];
	while(arr.length > size){
		result.push(arr.splice(0,size))
	}
	arr.length && result.push(arr)
	return result
}

15、回文字符串

let str = '上海自来水来自海上'
let str2 = 'sdfsdf上海自来水来自海上'

function isHuiWen(str) {
  return str === str.split('').reverse().join('')
}

16、快速排序

function qucikSort(arr) {
  // 递归结束条件
  if(arr.length <= 1){
    return arr; // 不满足条件的情况下,不拆分,返回原数组
  }
  
  // 1. 取中间值
  let flag = Math.floor(arr.length / 2);
  let flagValue = arr.splice(flag, 1)[0];
  let leftArr = [];
  let rightArr = [];
  for (var i = 0; i < arr.length; i++) {
    var arrItem = arr[i];
    
    if(arrItem > flagValue){
      rightArr.push(arrItem)
    }else{ // <=
      leftArr.push(arrItem)
    }
  }
  // 递归: 注意点:必须有结束条件,否则就是死循环
  leftArr = qucikSort(leftArr);
  rightArr = qucikSort(rightArr);
  return  [...leftArr, flagValue, ...rightArr]
}

17、字符串中出现最多次数的

var arr = 'sfadsflkajerfnksdajdfnldjk'
var obj ={}

for(var i=0 ; i<arr.length ;i++){
	if(obj[arr[i]]){
		obj[arr[i]] += 1
	}else{
		obj[arr[i]] = 1
	}
}

var max=0 
var targetChar = ''
for(key in obj){
	if(max < obj[key]){
		max = obj[key]
		targetChar = key
	}
}

console.log(targetChar,max)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值