高级前端面试100问(必会)_高级前端面试题

二、Promise
一、JS基础-原理实现
实现new

function newOperator(ctor) {
    if (typeof ctor !== 'function') {
        throw new Error('Constructor not a function')
    }

    const newObj = Object.create(ctor.prototype)
    const args = [].slice.call(arguments, 1)
    const returnObj = ctor.apply(newObj, args)

    const isObj = typeof returnObj==='object' && returnObj !== null;
    const isFunction = typeof returnObj === 'function'
    if (isObj || isFunction) {
        return returnObj
    }
    return newObj
}


实现bind

  1. 基本结论: bind是函数原型对象上,每个函数都可以调用 函数使用bind后,被调用对象是传入bind的第一个参数 当new
    被bind后的函数时,this指向了新生成的对象
Function.prototype.bindMock = function(target) {

  const originalFun = this;//this是调用bind的函数
  const args = [].slice.call(arguments,1)
  return function bound() {
    const boundArgs = [].slice.call(arguments)
    const finalArgs = args.concat(boundArgs)
    //this是new生成的对象
    if(this instanceof bound) {
      // new bound这种情况
      // orginalFun要绑定到新生成对象上调用
      const result = orginalFun.apply(this, finalArgs)
      const isObject = typeof result ==='object' && result!==null
      const isFunction = typeof result ==='function'
      if (isObject || isFunction) {
        return result
      }
      return this
    } else {
      return orginalFun.apply(target, finalArgs)
    }
    
    
  }
}


3、实现apply, call

function getGlobalObject() {
  return this
}
Function.prototype.applyFn = function(target, argsArray) {
  //check
  if (typeof this !== 'function') {
    throw new TypeError(this+"is not function")
  }

  if (argsArray === null ||typeof argsArray === 'undefined') {
    argsArray =[]
  }

  if (argsArray !== new Object(argsArray)) {
    throw new TypeError('createListFromArrayLike called on non-object')
  }

  if (typeof target === 'undefined') {
    target = getGlobalObject()
  }

  var original = target['\_fn']
  var hasOriginal = target.hasOwnProperty('\_fn')
  target['\_fn'] = this;
  var result = target['\_fn'](...argsArray)//这一步可以通过生成函数兼容旧浏览器
  if (hasOriginal) {
    target['\_fn'] = original;
  }
  return result;
}


4、实现一下es6的extends

function extends(child, parent) {
  if (typeof child !== 'function' && parent !== null) {
    throw new TypeError("super expression must either be null or a function")
  }

  child.prototype=Object.create(parent.prototype, {
    constructor: {
      value: child,
      writable: true,
      configurable: true
    }
  })
  if (parent) {
    child.__proto_ == parent
  }
}


5、Object.create实现, Object.create传null和{} 有啥区别吗

function createFun(o){
    //错误检查
    function Empty(){}
    Empty.prototype=o
    return new Empty()
}
//https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global\_Objects/Object/create#polyfill


存在弊端: 所有通过Object.create出来的对象共享原始obj属性

Object.create(null) 会创建一个真正的空对象,并没有继承Object原型链上的方法

6、实现数组扁平化函数flat


function reduceDim(arr, depth){
  let curQueue=[] 


##### 框架相关

原生JS虽能实现绝大部分功能,但要么就是过于繁琐,要么就是存在缺陷,故绝大多数开发者都会首选框架开发方案。现阶段较热门是React、Vue两大框架,两者工作原理上存在共通点,也存在一些不同点,对于校招来说,不需要两个框架都学得特别熟,一般面试官会针对你简历中写的框架进行提问。

在框架方面,**生命周期、钩子函数、虚拟DOM这些基本知识是必须要掌握的**,在学习的过程可以结合框架的官方文档

**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/topics/618166371)**

**Vue框架**

>**知识要点:**
>**1. vue-cli工程**
>**2. vue核心知识点**
>**3. vue-router**
>**4. vuex**
>**5. http请求**
>**6. UI样式**
>**7. 常用功能**
>**8. MVVM设计模式**

![](https://img-blog.csdnimg.cn/img_convert/e70218b623d4d0153bac6f22e68a5814.webp?x-oss-process=image/format,png)


**React框架**

>**知识要点:**
>**1. 基本知识**
>**2. React 组件**
>**3. React Redux**
>**4. React 路由**

![](https://img-blog.csdnimg.cn/img_convert/090b0c62f95f4b1e63b71de8839ae272.webp?x-oss-process=image/format,png)

*

[外链图片转存中...(img-IptVKs8V-1714205013785)]


**React框架**

>**知识要点:**
>**1. 基本知识**
>**2. React 组件**
>**3. React Redux**
>**4. React 路由**

[外链图片转存中...(img-TmwMIVOM-1714205013786)]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
高级前端面试通常涵盖了广泛的主,包括HTML、CSS、JavaScript、前端框架、性能优化、网络请求等。以下是一些常见的高级前端面试及其答案: 1. 请解释一下什么是事件委托(Event Delegation)? 事件委托是一种利用事件冒泡的机制,将事件处理程序绑定到父元素上,通过判断事件源来执行相应的操作。这样可以减少事件处理程序的数量,提高性能和代码的可维护性。 2. 请解释一下什么是闭包(Closure)? 闭包是指函数可以访并操作其外部函数作用域中的变量,即使外部函数已经执行完毕。闭包可以用来创建私有变量和实现模块化等功能。 3. 请解释一下什么是跨域(Cross-Origin)请求? 跨域请求是指在浏览器中,当前网页的域名、协议或端口与请求资源的域名、协议或端口不一致时,浏览器阻止该请求。为了解决跨域,可以使用JSONP、CORS、代理服务器等方法。 4. 请解释一下什么是虚拟DOM(Virtual DOM)? 虚拟DOM是指通过JavaScript对象来描述真实DOM结构的一种技术。通过比较虚拟DOM和真实DOM的差异,可以最小化DOM操作,提高性能。 5. 请解释一下什么是防抖(Debounce)和节流(Throttle)? 防抖和节流都是用来控制函数执行频率的方法。防抖是指在事件触发后等待一段时间,如果在这段时间内再次触发事件,则重新计时。节流是指在一定时间间隔内只执行一次函数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值