Hello, Boswell!
  • js

js

es6 及其以后的所有被加到标准中的新特性罗列,想到多少说多少

  • let const
  • 箭头函数
  • 模板字符串
  • 增强对象
  • Promise
  • async await
  • 解构赋值
  • 展开运算符
  • ......

声明变量的三个关键字是什么?var、const 和 let 的主要区别是什么?

  • var、const 和 let
  • let 是变量,const 是常量
  • 用 let 和 const 声明的变量是块范围的;用 var 声明的变量是全局范围的或函数范围的。
  • var 变量可以在其范围内更新和重新声明;让变量可以更新但不能重新声明;const 变量既不能更新也不能重新声明。
  • var 可以提升到其作用域的顶部。其中 var 变量初始化为未定义,let 和 const 变量未初始化(临时死区,TDZ)。
  • 虽然可以在不初始化的情况下声明 var 和 let,但必须在声明期间初始化 const。

==和===的区别

  • ==两边的操作项会发生隐式类型转换再进行值比对
  • ===两边的操作项会比对类型和值

js 中的小数计算会有什么问题

  • 精度缺失问题

如何解决

  • 转换为整数后再计算,然后除以 10 的(小数位数的)指数

&& 与 || 操作符的优先级

|| < &&

箭头函数的 this 指向?

  • 指向父级作用域的 this 对象
  • 箭头函数不会受到 call,apply,bind 的影响

如何修改一个函数中的 this 指向

  • bind(obj),call(obj,a,b),apply(obj,[])

Vue2,3 中的响应式功能,依赖了 js 的什么特性

  1. Object.defineProperty(obj,'x',{get(){},set(){}})
  2. new Proxy(obj,{get(){},set(){}})

模块的导入导出用法

  • export const a = 0; export default {}
  • import { a }; import a

打包工具中的树摇是做什么用的

  • 将代码中的死代码,无用代码,去掉,减少打包产物的体积

什么是浅拷贝和深拷贝

  • 浅拷贝:引用拷贝
  • 深拷贝: 值拷贝

节流和防抖

  • 节流:一段时间执行一次。
  • 防抖:最后一次才执行。有一个提交订单的按钮,由于用户快速,多次点击导致提交多个重复订单,如何解决?

什么是跨域

浏览器的同源策略,同源是指"协议+域名+端口"三者相同

解决方案

  • 代理
  • cors
  • jsonp

jsonp 的原理

  • 利用 script 跨域机制,将数据包裹再 js 函数调用中,传递给已经定义好的函数

什么是原型

  • 构造函数的prototype指向的一个对象,也叫原型对象

什么是原型链

  • 原型对象也会指向自己的原型对象,一层一层向上指向形成的链路

如何创建一个没有原型的对象

  • Object.create(null)

什么是闭包函数

  • 能够外部作用域的函数,叫做闭包函数

动手来实现一下 new

function mynew(Func, ...args) {
  // 1.创建一个新对象
  const obj = {};
  // 2.新对象原型指向构造函数原型对象
  obj.__proto__ = Func.prototype;
  // 3.将构建函数的this指向新对象
  let result = Func.apply(obj, args);
  // 4.根据返回值判断
  return result instanceof Object ? result : obj;
}

闭包在项目中的应用场景

  • 防抖
function debounce(fn, time) {
  let timer = null;
  return function () {
    clearTimeout(timer);
    setTimeout((...args) => {
      fn.apply(this, args);
    }, 300);
  };
}
  • 节流
function throttling(fn, time) {
  let timer = null;

  return function (...args) {
    if (!timer) {
      timer = setTimeout(() => {
        fn.apply(this, args);
        timer = null;
      }, time);
    }
  };
}
  • 内部成员变量

动手来实现一下 new

function mynew(Func, ...args) {
  // 1.创建一个新对象
  const obj = {};
  // 2.新对象原型指向构造函数原型对象
  obj.__proto__ = Func.prototype;
  // 3.将构建函数的this指向新对象
  let result = Func.apply(obj, args);
  // 4.根据返回值判断
  return result instanceof Object ? result : obj;
}

一个 Promise 实例有哪些状态?

  1. resolved
  2. pending
  3. rejected

Promise 中异常处理方式

  • new Promise().catch()
  • new Promise((reslove,reject)=>{},(err)=>{})
  • async awiat,使用 try{}catch(e){}finally{}

catch方法后的then方法还会执行吗

  • 会

如何进行异步编程,串行,并行

  • promise
  • async await

Promise值穿透

Promise.resolve(1)
.then(2)
.then(Promise.resolve(3))
.then(console.log)

Promise.resolve(1)会返回一个promise对象并且会将1当做then的参数。而.then 或者 .catch 的参数期望是函数,传入非函数则会发生值穿透。所以最后会输出:1。

题目

数组去重

  • 原生方法:[...new Set([1,2,3,4,1])]

冒泡排序

  • 从第一位开始与相邻元素进行比对,大数两方交换,一直对比到最后。

快速排序

  • 选取一个中间数,将数组根据中间数分为两组,进行递归。
Last Updated:
Contributors: mingzhuang.ji