一、Javascript
- js数据类型?及检测?
①共8种常用的6种类型:
基本类型:Number String Boolean undefined Null
引用类型:object function
不常用2种类型:Symbol bigInt
② 检测数据类型
typeof 判断数据类型
instanceof 检测是否为类的实例
constructor 检测构造函数
Prototype检测数据类型
1.浅拷贝: 将一个对象的所有属性拷贝到另一个对象 (并且改变拷贝的对象, 不影响原始对象)
浅拷贝: 只能拷贝一层对象,或者一层数组,复杂会有bug
两个方法:
(1)Object.assign()
(2) ... 展开运算符
2.深拷贝: 将一个对象的所有属性拷贝到另一个对象
(并且改变拷贝的对象, 也不影响含多层对象的原始对象)
三个方法:
(1)通过递归实现深拷贝
(2) JSON.stringify() JSON.parse()
(3) lodash
3.函数递归:函数内部自己调用自己, 这个函数就是递归函数
- Javascript中的原型和原型链有了解吗?
原型:
1.显示原型:prototype,是每个函数拥有的属性,它指向函数的原型对象。
function person(){}
console.log(person.prototype)
2.隐式原型:_proto_,是每个对象拥有的属性,它指向创建该对象的函数的原型对象。
原型链:
原型链就是在当前对象中找不到定义的话,会在当前对象的原型对象上继续查找,直至undefined。
原型和原型链存在的意义是什么?
实例对象可以共享构造函数原型属性和方法,节省内存。
构造函数原型上的属性和方法越多, 节省内存越大。
- 什么是作用域,作用域链?
就比如 if 判断if 判断里定义的的一个变量就叫作用域,如果在判断外定义一个变量就叫全局作用域
- 说说你对闭包的理解以及使用场景?
①闭包:在一个函数内部创建另一个函数(函数套函数)
优点:可以将一个变量长期储存在内存中,用于缓存,可以避免全局变量的污染
缺点:函数中的变量都被保存在内存中,参数和变量不会被垃圾回收机制回收,
会导致内存泄漏,否 则会影响网页性能,卡顿问题
内存泄漏:不再使用到的内存,如果没有及时释放,就叫做内存泄露
- 说说你对Javascript中this对象的理解?
在一般情况下,this对象指的是谁一般取决于函数被调用的方式
函数有4种调用方式:
1.直接调用,在一般函数中使用this指向全局对象.
2.某个对象的方法调用,this指的是这个上级对象
3.作为构造函数调用,this指的是new出来的对象。
4.apply调用,apply方法是改变函数的调用对象,此方法的第一个参数为改变后调用这个函数的对象,this指代第一个参数
- 你是怎么理解ES6中promise?
概念:Promise 构造函数是同步执行的,promise.then 中的函数是异步执行
三种状态:
pending(等待中)、resolved(已经完成)、rejected(得到结果)
Promise的状态是否可改变?
是不可变的。当promise进入fulfilled或rejected后状态不可改变
Promise如何解决地域回调?
当我们发起网络请求时,有可能需要一个请求的结果返回后再执行下一个请求,
这样可能会形成回调地狱
如何让Promise顺序执行?
通过async await可使得Promise按顺序执行
Promise 构造函数:
1)Promise.then方法(里面有两个函数,一个是成功调用,一个是失败调用)
2)Promise.cath方法(用来捕获promise异步操作失败的方法)
3)Promise.reslove方法 (创建Promise成功的案例)
4)Promise.reject方法 (创建Promise失败的案例)
5)Promise.all()方法 (接收一个包含多个promise对象的数组,等待所有的都完成时,
返回存放他们结结果的数组,全部异步操作执行完成后,执行.then方法)
6)Promise.race()方法 (接收一个包含多个promise对象的数组,
数组内第一个完成的promise对象 决定了整个promise对象的状态的,
有一个异步操作执行完成后,就执行.then方法)
- async/await
async函数返回值是一个promise对象,返回的promise的结果是由函数执行的结果决定
是promise链式调用的优化,属于es8语法
- es6有哪些新特性?
1.var与let、const
2.模板字符串
3.展开数组 ...
4,箭头函数
5.函数传递参数的时候的默认值
6.解构赋值
7.对象字面量简写
- var与let、const有什么区别?
var变量提升 函数作用域 值可更改
let,const 不存在提升 块级作用域,const值不可更改
- 说说函数节流和防抖?有什么区别?如何实现?
概念:控制函数在高频事件下的触发次数,降低函数执行频率,节省计算资源,提高性能。
不然的话,会容易造成网络阻塞,页面卡顿,或者数据错乱覆盖等情况。
两者区别:
防抖 | 节流 |
高频事件下,控制执行最后一次 | 高频事件下,控制(函数)执行的次数。也就是一个单位时间内,只允许执行1次 |
相同点:
都可以通过使用 setTimeout 实现
目的都是,降低回调执行频率。节省计算资源
不同点:
函数防抖,在一段连续操作结束后,处理回调,利用clearTimeout和 setTimeout实现。函数节流,在一段连续操作中,每一段时间只执行一次,频率较高的事件中使用来提高性能
函数防抖关注一定时间连续触发的事件,只在最后执行一次,而函数节流一段时间内只执行一次
应用场景
防抖在连续的事件,只需触发一次回调的场景有:
搜索框搜索输入。只需用户最后一次输入完,再发送请求
手机号、邮箱验证输入检测
窗口大小resize。只需窗口调整完成后,计算窗口大小。防止重复渲染。
节流在间隔一段时间执行一次回调的场景有:
滚动加载,加载更多或滚到底部监听
搜索框,搜索联想功能
- == 和 === 的区别和使用场景?
根据数据类型,和值进行比较,===相对于严谨
- 解释一下JavaScript垃圾回收?
JavaScript中会被判定为垃圾的情形如下:
对象不再被引用;
对象不能从根上访问到;
常见的GC算法如下:
(1)标记清除法
(2)引用计数法
(3)标记整理
(4)分代回收
- 对栈和堆内存有了解吗,二者的区别
堆(heap):堆用来存放进程运行中被动态分配的内存段,需要程序员分配和释放。
栈(stack):在栈存放函数的参数值,返回值,局部变量等,由系统自动分配和释放。
区别:管理方式,空间大小,碎片问题,生长方向,分配方式,分配效率(后期补充)
- Javascript中的事件模型如何理解?
事件模型可以分为三种:
原始事件模型(DOM0级)
标准事件模型(DOM2级)
IE事件模型(基本不用)
- 介绍一下宏任务和微任务
宏任务:setTimeout,setInterval,Ajax,DOM事件 (DOM渲染后触发)
- 微任务:Promise,async/await (DOM渲染前触发)