前端常见手撕题(详细注释版):持续更新中……

本文详细解析了前端面试中常见的手撕代码题目,包括instanceof、实现new关键字、ajax、Promise.all、拷贝(浅拷贝、深拷贝)、防抖和节流等,帮助开发者深入理解并掌握相关技术。

01.手撕instanceof

第一个参数是实例,第二个参数是构造函数

function myInstanceof(instance, object) {
   
   
    let current = instance;  //定义一个指针存储当前实例的位置
    let target = object.prototype; //存储目标构造函数的原型对象
    while(current) {
   
      //指针指向null时说明原型链上没这个构造函数
        if(current.__proto__ == target) {
   
     //如果找到了,就返回true
            return true;
        } else {
   
      //如果没找到,指针向后指
            current = current.__proto__
        }
    }
    //如果找到最后的null都没有,说明该实例不属于object所在原型链上任何一个原型对象
    return false;
}

测试代码:

console.log([1,2,3] instanceof Array); //true
console.log(myInstanceof([1,2,3], Array)) //true

console.log([1,2,3] instanceof Object);//true
console.log(myInstanceof([1,2,3], Object)); //true

console.log([1,2,3] instanceof Function);//false
console.log(myInstanceof([1,2,3], Function)); //false

console.log([1,2,3] instanceof RegExp);//false
console.log(myInstanceof(/1/, RegExp)); //true

02.如何让 0.1+0.2 === 0.3

function withinError(left, right) {
   
   
    return Math.abs(left-right) < Number.EPSILON;
}

console.log(withinError(0.1 + 0.2, 0.3)); //true

03.手撕new关键字

第一个参数是构造函数,第二个参数是实例化时的参数

function myNew(Fn, ...args) {
   
   
    //1.判断传入的是否是一个函数
    if(typeof Fn != 'function') return false;
    //2.创建一个新对象,让该对象的__proto__指向构造函数的prototype
    const obj = Object.create(Fn.ptototype);
    //3.让Fn中的this指向这个新创建的对象,并给它们传值
    let result = Fn.call(obj, ...args);
    //4.如果构造函数写了返回值,要判断,如果是复杂数据类型,那么就返回该返回值
    if(result && (typeof result === 'object' || typeof result === 'function')) {
   
   
        return result;
    }
    //5.如果构造函数没有返回值、或有返回值但是简单数据类型,则返回新创建的对象
    return obj;
}

04.手写原生ajax

<body>
    <button>点击发送请求</button>
    <div id="result"></div>

    <script>
        //获取button元素
        const btn = document.querySelector('button');
        const result = document.querySelector('#result');
        btn.addEventListener('click', function() {
     
     
           //1.创建对象
            const xhr = new XMLHttpRequest(
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值