大家好,关于高效求职攻略:手写面试技巧全解析很多朋友都还不太明白,今天小编就来为大家分享关于的知识,希望对各位有所帮助!
throw new TypeError("不是函数");
}
if (上下文===未定义|| 上下文===null) {
//如果传入的context对象未定义或者为null,则直接使用window对象作为context对象。
上下文=窗口;
} 别的{
上下文=对象(上下文);
}
var SpecialPrototype=Symbol("specialPrototype"); //添加到上下文对象的临时属性
上下文[特殊原型]=this; //将此函数添加到上下文对象中
var 结果=context[specialPrototype](.args); //调用上下文对象上的方法来获取执行结果
删除上下文[specialPrototype]; //删除上下文对象上添加的临时属性
返回结果; //返回函数执行结果
}
二、手写bind函数
Function.prototype.myBind=函数(thisArg) {
if (this 的类型!=="函数") {
throw new TypeError("不是函数");
}
var that=this;
var args=Array.prototype.slice.call(参数, 1);
var fn=函数() {}
var fnBound=函数() {
const _this=fn 的这个实例?第: 章
const newArgs=args.concat(Array.prototype.slice.call(arguments));
return that.apply(_this, newArgs);
}
if (this.prototype) {
fn.prototype=this.prototype;
}
fnBound.prototype=new fn();
fnBound.prototype.constructor=this;
返回fnBound;
};
三、手写实现new功能的函数
函数myNew(fn,args) {
//创建一个空对象,并将实例化对象的原型指向构造函数的原型对象
const 实例=Object.create(fn.prototype);
//构造函数的this指向实例化的对象
const res=fn.apply(实例, args);
//确定返回值。如果函数返回值是基本数据类型,则new产生的对象仍然是创建的对象。
返回对象实例?资源: 实例;
}
四、手写reduce函数
Array.prototype.myReduce=函数(fn,initialValue){
//判断调用对象是否是数组
if (Object.prototype.toString.call(this) !=="[对象数组]") {
throw new TypeError("不是数组");
}
//判断调用数组是否为空数组
if (this.length===0) {
throw new TypeError("空数组");
}
//判断传入的第一个参数是否是函数
if (typeof fn !=="函数") {
throw new TypeError(`${fn} 不是函数`);
}
//初始化回调函数参数
var 源数组=this;
var 结果,当前值,当前索引;
如果(初始值!==未定义){
结果=初始值;
当前索引=0;
} 别的{
结果=源数组[0];
当前索引=1;
}
//开始循环
while (currentIndex sourceArray.length) {
if (Object.prototype.hasOwnProperty.call(sourceArray, currentIndex)) {
当前值=sourceArray[当前索引];
结果=fn(结果、当前值、当前索引、源数组);
}
当前索引++;
}
//返回结果
返回结果;
}
五、手写防抖函数
函数去抖动(fn, 延迟=300) {
if (typeof fn !=="函数") {
throw new TypeError(`${fn} 不是函数`);
}
让计时器=空;
返回(.参数)={
如果(计时器){
清除超时(计时器);
}
计时器=setTimeout(()={
fn.apply(this, args);
}, 延迟);
}
}
六、手写节流函数
函数油门(fn, 持续时间=500) {
if (typeof fn !=="函数") {
throw new TypeError(`${fn} 不是函数`);
}
让lastTime=new Date().getTime();le
返回(.参数)={
const now=new Date().getTime();
if (现在- 最后时间=持续时间) {
fn.apply(this, args);
上次=现在;
}
}
}
七、手写Promise类 (实现了Promise/A+ 的大部分规范)
//定义promise的三个状态值
var 承诺状态={
PENDING: "待定",
FULFILLED: "已完成",
REJECTED: "拒绝",
}
函数MyPromise(任务) {
if(任务类型!=="函数") {
throw new TypeError(`${task} 不是函数`);
}
this.status=PromiseStatus.PENDING; //设置初始状态
this.value=未定义;
this.thenCallback=未定义;
this.catchCallback=未定义;
var _this=这个; //缓存这个对象
var 解析=函数(值){
if (_this.status===PromiseStatus.PENDING) {
_this.status=promiseStatus.FULFILLED;
_this.value=值;
if(MyPromise 的值实例) {
值.then(函数(res) {
if (_this.thenCallback) {
_this.thenCallback(res);
} else if (_this.catchCallback) {
_this.catchCallback(res);
}
});
} 别的{
//这里使用SetTimeout来模拟异步任务。实际的promise是一个微任务,回调函数会被放入微任务队列中。
设置超时(函数(){
if (_this.thenCallback) {
_this.thenCallback(_this.value);
} else if (_this.catchCallback) {
_this.catchCallback(_this.value);
}
});
}
}
}
var拒绝=函数(errValue){
if (_this.status===PromiseStatus.PENDING) {
_this.status=PromiseStatus.REJECTED;
_this.value=errValue;
//这里使用SetTimeout来模拟异步任务。实际的promise是一个微任务,回调函数会被放入微任务队列中。
设置超时(函数(){
如果(_this.catchCallback){
_this.catchCallback(_this.value);
} else if (_this.thenCallback) {
_this.thenCallback(_this.value);
}
});
}
}
尝试{
任务(解决,拒绝);
} 捕获(错误){
拒绝(错误);
}
}
MyPromise.prototype.then=function(onFulfilledCallback, onRejectedCallback) {
var _this=这个;
//返回promise对象以确保链式调用
返回新的MyPromise(函数(解决,拒绝){
if (typeof onFulfilledCallback==="函数") {
_this.thenCallback=函数(值) {
/**
* 因为使用链式调用时,第一个调用可能不是then
* 所以我们在做检测的时候,会使用then来向下传递catch信息。
* 所以当我们检测到触发thenCallback的Promise对象的状态被拒绝
* 我们会继续调用下一个Promise对象的reject
*/
if (_this.status===PromiseStatus.REJECTED) {
拒绝(值);
} 别的{
//用户传入的方法执行时必须用try包裹起来。
尝试{
var res=onFulfilledCallback(值);
if(res instanceof MyPromise res.status===PromiseStatus.REJECTED) {
res.catch(函数(errValue) {
拒绝(错误值);
});
} 别的{
解决(res);
}
} 捕获(错误){
拒绝(错误);
}
}
};
}
if (typeof onRejectedCallback==="函数") {
_this.catchCallback=函数(errValue) {
/**
* 因为使用链式调用时,第一个调用可能不会被catch。
* 所以我们在做检测的时候,会使用catch来向下传递then信息。
* 所以我们检测到触发catchCallback的Promise对象的状态已完成
* 我们会继续调用下一个Promise对象的resolve
*/
if (_this.status===PromiseStatus.FULFILLED) {
解决(错误值);
} 别的{
//用户传入的方法执行时必须用try包裹起来。
尝试{
var res=onRejectedCallback(errValue);
if(res instanceof MyPromise res.status===PromiseStatus.REJECTED) {
res.catch(函数(errValue) {
拒绝(错误值);
});
} 别的{
解决(res);
}
} 捕获(错误){
拒绝(错误);
}
}
}
}
});
}
MyPromise.prototype.catch=函数(onRejectedCallback) {
返回this.then(null, onRejectedCallback);
}
MyPromise.prototype.finally=函数(onFinallyCallback) {
返回this.then(函数(res) {
onFinallyCallback();
返回资源;
},函数(错误){
onFinallyCallback();
抛出新的错误(错误);
});
}
MyPromise.resolve=函数(值){
返回新的MyPromise(函数(解决,拒绝){
解决(值);
});
}
MyPromise.reject=函数(errValue) {
返回新的MyPromise(函数(解决,拒绝){
拒绝(错误值);
});
}
MyPromise.all=函数(promiseArr) {
var resArr=[];
返回新的MyPromise(函数(解决,拒绝){
PromiseArr.forEach(函数(项目,索引){
item.then(函数(res) {
resArr[索引]=res;
var allResolve=promiseArr.every(function(_item) {
return _item.status===PromiseStatus.FULFILLED;
})
如果(全部解决){
解决(resArr);
}
}).catch(函数(错误){
拒绝(错误);
})
});
});
}
MyPromise.race=函数(promiseArr) {
返回新的MyPromise(函数(解决,拒绝){
PromiseArr.forEach(函数(项目,索引){
item.then(函数(res) {
解决(res);
}).catch(函数(错误){
拒绝(错误);
});
});
});
}
MyPromise.allSettled=函数(promiseArr) {
var resAll=[];
返回新的MyPromise(函数(解决,拒绝){
PromiseArr.forEach(函数(项目,索引){
item.then(函数(res) {
常量对象={
status: PromiseStatus.FULFILLED,
值:资源,
}
resArr[索引]=obj;
var allResolve=promiseArr.every(function(_item) {
return _item.status !==PromiseStatus.PENDING;
});
如果(全部解决){
解决(resArr);
}
}).catch(函数(错误){
常量对象={
status: PromiseStatus.REJECTED,
值:错误,
}
resArr[索引]=obj;
var allResolve=PromiseArr.every(function (_item) {
return _item.status !==PromiseStatus.PENDING;
});
如果(全部解决){
解决(resArr);
}
});
})
});
}
八、手写XMLHttpRequest发送请求
函数请求(方法,url,参数){
//初始化实例
让xhr;
if (window.XMLHttpRequest) {
xhr=new XMLHttpRequest();
}别的{
xhr=new ActiveXObject("microsoft.XMLHTTP");
}
方法=方法?第:章
如果(方法==="POST"){
xhr.setRequestHeader("内容类型", "application/x-www-form-urlencoded");
}
xhr.open(方法, url, true);
xhr.onreadystatechange=函数() {
//只有当readyState===4且status===200时,才会正常返回数据
if (xhr.readyState===4) {
if (xhr.status===200) {
//通过JSON.parse() 将test.json 中的数据转换为json 对象
console.log(JSON.parse(xhr.responseText))
} 别的{
console.log("其他情况")
}
}
}
xhr.sent(method==="GET" ? null : JSON.stringify(params));
}
九、手写深拷贝deepClone函数
函数deepClone (值, map=new WeakMap()) {
让新值=值;
if (obj 的值类型==="对象") {
//使用map防止循环引用,检查map中是否有,如果有记录则直接返回
const oldValue=map.get(value);
如果(旧值){
返回旧值;
}
//如果没有记录,则创建一个新对象
newValue=value.constructor==数组? []:{};
//记录引用
map.set(值, newValue);
for(让键入值){
常量项=值[键];
newValue[key]=item typeof item==="object" ?参数.callee(项目,地图):项目;
}
}
返回新值;
}
十、手写一个比较完美的继承
函数继承Prototype(subType, superType){
var protoType=Object.create(superType.prototype); //创建对象
protoType.constructor=subType; //增强对象
subType.prototype=protoType; //指定对象
}
函数SuperType(名称){
this.name=名称;
this.colors=["红色", "蓝色", "绿色"];
}
SuperType.prototype.sayName=函数(){
console.log("名称", this.name);
}
函数子类型(姓名,年龄){
SuperType.call(this, 名称);
this.age=年龄;
}
继承原型(子类型,超类型)
SubType.prototype.sayAge=function(){
console.log("年龄", this.age);
}
var instance=new SubType("Bob", 18);
实例.sayName();
如果你还想了解更多这方面的信息,记得收藏关注本站。
【高效求职攻略:手写面试技巧全解析】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
手写代码真是一个考验!
有20位网友表示赞同!
想在面试中脱颖而出,手写代码可不能落下啊!
有9位网友表示赞同!
学习哪些手写的代码呢?感觉很有必要好好了解一下。
有17位网友表示赞同!
面试官看重的是你的编码能力和思路吧?
有17位网友表示赞同!
希望这篇文章能透彻地讲解手写代码的技巧!
有9位网友表示赞同!
之前也听说过手写代码是面试中的关键,现在看来确实很重要啊!
有18位网友表示赞同!
想知道哪些常见的算法需要手写才能体现优势。
有10位网友表示赞同!
准备面试了,好好看看这篇文章,希望能提升我的表现!
有6位网友表示赞同!
期待作者分享一些宝贵经验和技巧!
有11位网友表示赞同!
手写代码的确能展现出程序员的真实水平啊!
有18位网友表示赞同!
要准备哪些必备知识点呢?提前学习一下比较好。
有9位网友表示赞同!
面试官会提问什么类型的题目呢?这篇文章应该会有讲解吧!
有6位网友表示赞同!
想成为一名优秀的程序员,手写代码技术是必须掌握的啊!
有19位网友表示赞同!
我平时很少进行手写的代码练习,看来需要加强一下了。
有17位网友表示赞同!
这篇文章肯定能让我的面试更加顺利!
有12位网友表示赞同!
不知道有哪些资源可以帮助我学习手写代码的技巧?
有9位网友表示赞同!
希望这篇文章能让我了解面试过程中如何表现自己!
有15位网友表示赞同!
感觉手写代码是一种很独特的测试方式,需要认真对待。
有12位网友表示赞同!
学习了这些手写的代码秘籍,我相信我的面试成功率会提高!
有19位网友表示赞同!
我一定仔细阅读这篇文章,把它学以致用!
有9位网友表示赞同!