JS面试题

2021-05-31  本文已影响0人  翔子丶

js 基本类型?null 和 undefined 区别

介绍 js 有哪些内置对象?

渐进增强和优雅降级

JS 严格模式

use strict 使得 js 代码在更严格的条件下运行,使 js 编码更加规化,消除 js 语法的一些不合理、不严谨之处,减少一些怪异行为

事件冒泡和事件捕获

一个事件触发时会进行事件流,而事件流有两个阶段:1、从外到里为捕获阶段;2、从里到外为冒泡阶段

事件委托

将原本绑定在子元素的事件委托给父元素,原理就是 DOM 元素的事件冒泡,使用事件代理的好处是提高性能

可以节省内存占用,减少事件注册

实现新增子元素是无需再次对其绑定

eval 是做什么的

闭包的理解

有权访问其他函数作用域内变量的函数,定义在函数内的函数,可以访问当前函数定义的变量,而定义在函数外的函数,就无法访问函数内部的变量

由于在 js 内变量的作用域属于函数作用域,当函数执行完后作用域就被清理、内存也随之被回收,但由于闭包是建立在一个函数内部的子函数,由于其可访问上级作用域原因,即使上级函数执行完,作用域也不会随之销毁

使用场景:setTimeout、回调、函数防抖、实现封装(私有变量提供闭包访问)和缓存(设置变量,存储闭包函数执行结果)

原型链

由于__proto__是任何对象都有的属性,所以形成一条__proto__连接起来的链条,当查找对象属性时,先查找对象本身是否有此属性,如果不存在会在原型链上查找

prototype 时函数才有的属性

__proto__是每个对象都有的属性

instance.constructor.prototype === instance.__proto__

this 理解

说一下什么是栈、什么是堆、什么是队列

深浅拷贝

JavaScript 继承

new 操作符具体干了什么呢?

防抖节流代码实现

类型检测

数组去重

数组扁平化处理

以上 7 个知识点js 手写代码题

通用事件监听函数

// event(事件)工具集
markyun.Event = {
  // 页面加载完成后
  readyEvent: function (fn) {
    if (fn == null) {
      fn = document
    }
    var oldonload = window.onload
    if (typeof window.onload != 'function') {
      window.onload = fn
    } else {
      window.onload = function () {
        oldonload()
        fn()
      }
    }
  },
  // 视能力分别使用dom0||dom2||IE方式 来绑定事件
  // 参数: 操作的元素,事件名称 ,事件处理程序
  addEvent: function (element, type, handler) {
    if (element.addEventListener) {
      //事件类型、需要执行的函数、是否捕捉
      element.addEventListener(type, handler, false)
    } else if (element.attachEvent) {
      element.attachEvent('on' + type, function () {
        handler.call(element)
      })
    } else {
      element['on' + type] = handler
    }
  },
  // 移除事件
  removeEvent: function (element, type, handler) {
    if (element.removeEnentListener) {
      element.removeEnentListener(type, handler, false)
    } else if (element.datachEvent) {
      element.detachEvent('on' + type, handler)
    } else {
      element['on' + type] = null
    }
  },
  // 阻止事件 (主要是事件冒泡,因为IE不支持事件捕获)
  stopPropagation: function (ev) {
    if (ev.stopPropagation) {
      ev.stopPropagation()
    } else {
      ev.cancelBubble = true
    }
  },
  // 取消事件的默认行为
  preventDefault: function (event) {
    if (event.preventDefault) {
      event.preventDefault()
    } else {
      event.returnValue = false
    }
  },
  // 获取事件目标
  getTarget: function (event) {
    return event.target || event.srcElement
  },
  // 获取event对象的引用,取到事件的所有信息,确保随时能使用event;
  getEvent: function (e) {
    var ev = e || window.event
    if (!ev) {
      var c = this.getEvent.caller
      while (c) {
        ev = c.arguments[0]
        if (ev && Event == ev.constructor) {
          break
        }
        c = c.caller
      }
    }
    return ev
  },
}

跨域问题处理

异步加载 JS 的方式有哪些?

AMD 和 DommonJS 的理解

箭头函数和普通函数的区别

Promise 防止某一个 promise 失败而导致整个 promise 失败

async/await 捕获异常

// 抽离成公共方法
const awaitWrap = (promise) => {
  return promise.then((data) => [null, data]).catch((err) => [err, null])
}
const [err, data] = await awaitWrap(fetchData())
console.log('err', err)
console.log('data', data)

const 可以不给值吗

不可以,const 一旦声明变量,就必须立即初始化,不能留到以后赋值。
必须在声明的同一语句中指定它的值(这是有道理的,因为以后不能更改)

上一篇 下一篇

猜你喜欢

热点阅读