JavaScript
JavaScript是一种轻量级、解释型或者说即时编译型的编程语言, [20]广泛应用于网页开发中,主要用于增强网页的交互性和动态性。作为Web开发的核心技术之一,它与HTML和CSS共同协作,HTML负责定义网页的内容结构,CSS处理样式和布局,而JavaScript则控制网页的行为和交互。
js的事件循环机制
js是单线程的,会出现阻塞问题。
比如说网络请求和 settimeout ,它通过异步来做的,若都用异步则会放在队列里面,异步队列没有优先级,所以为了更灵活增加了事件循环
事件循环:
js是单线程,有同步任务和异步任务,一般是异步任务又分为微任务和宏任务
先执行同步任务队列,再执行微任务队列,之后再执行宏任务,每执行一次宏任务时会时时检测微任务队列有没有任务,若有则会先清空微任务队列,执行完了,再去执行下一个宏任务。
运行机制:
单线程,从上到下按顺序执行代码。运行的两个阶段:
- **预解析:**把所有的函数定义提前,所有的变量声明提前,变量的赋值不提前
 - **执行:**从上到下执行(按照js运行机制)
 
javascript的数据类型
Boolean、null、String、Number、Object、Undefined
常见基本数据类型:Number、String 、Boolean、Null 和 Undefined。
基本数据类型是按值访问的,因为可以直接操作保存在变量中的实际值
引用类型:Object 、Array 、Function 、Data等。
怎样判断变量的类型
typeof 能够区分除数组、对象和null外的所有类型,[] {} null 都返回object
instanceof 及原理:object.toString().call()
Cookie(4kb)、 storage (5MB) localStorage(5-10MB)
首先,webstorage中包含sessionStorage和localStorage。 cookie和webstorage的区别:
- 出现的时间:
cookie很早之前就有了,webstorageH5之后才有的 - 跟随请求状态:cookie 会跟着前后台请求,webstorage 不跟随
 - **储存大小:**cookie 4K,storage 5M左右
 - **生命周期:**cookie 生命周期可以设置,webstorage 生命周期不可设置
 - **存在的位置:**cookie / sessionStorage / localStorage 在客户端,seesion 在服务端,较其他的安全
 
操作数组和对象的常见方法
array: slice / splice / concat / filter / map / reduce
obj : keys / assign
示例:
1  | const fruits = ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango'];  | 
new内部做了什么
- 创建了一个新对象 
var obj = {}; this关键字指向obj;prototype原型指向obj原型;- 执行构造函数
 
防抖、节流 , 函数节流的应用场景
js 中一些事件如浏览器的 resize、scroll,鼠标的 mousemove、mouseover,input 输入框的 keypress 等事件在触发时,会不断地调用绑定在事件上的回调函数,极大地浪费资源,降低前端性能。为优化体验,需要对这类事件进行调用次数的限制。
**函数防抖:**在一段连续操作结束后,处理回调,利用 clearTimeout 和 setTimeout实现
**函数节流:**每隔一段时间,只执行一次函数。
场景:
- 滚动加载,加载更多或滚到底部监听;
 - 谷歌搜索框,搜索联想功能;
 - 高频点击提交,表单重复提交
 
this指向
- 普通函数调用,此时 this 指向 
window - 构造函数调用,此时 this 指向 
实例对象 - 对象方法调用,此时 this 指向 
该方法所属的对象 - 通过事件绑定的方法,此时 this 指向 
绑定事件的对象 - 定时器函数,此时 this 指向 
window 
let const var 的区别
var:作用域是全域的; var允许重复声明变量
let:作用域是块级;let不允许重复声明变量
const:声明的是常量,不可改变,必须初始化,作用于块级作用域,没有变量提升,不允许重复声明
实现继承的几种方式
原型链继承、构造继承、实例继承、拷贝继承、组合继承
promiss的理解
Promise 是 JavaScript 中异步编程的一种解决方案,用于处理异步操作的结果
**特点:**Promise 对象的状态不受外界影响,只有异步操作的结果才能决定其状态
优点:
- 解决了回调地狱问题,使得代码结构更加清晰和可维护;
 - 提供了统一的API,使得异步操作的控制更加容易
 - function a(){ var n =0; function b(){ n++; console.log(n); }}js
 
**回调地狱问题:**每个接口都依赖于前一个接口的返回,
promiss为什么支持链式调用
在 then 方法中返回另一个 Promise,因此可将多个 then 方法串联起来,形成一个链式调用。每个 then 方法的返回值都会作为下一个 then 方法的输入,从而实现异步操作的顺序执行。如下示例:
1  | function getPromise(value) {  | 
在 try,catch中 报错了在catch中会被检测到么
如果在 catch 块中再次抛出错误,这个新的错误可以被外层的 try…catch 语句捕获,或者如果没有外层的 try…catch 语句,它会继续向上抛出,直到被捕获或导致程序终止。
浏览器垃圾回收
当 JavaScript 代码运行时,需要分配内存空间来存储变量和值。
当变量不再参与运行时,就需要系统收回被占用的内存空间,这就是垃圾回收
常见内存泄露的原因
- 全局变量引起的内存泄露
 - 闭包引起的内存泄露:慎用闭包
 - dom清空或删除时,事件未清除导致的内存泄漏
 - 循环引用带来的内存泄露
 
优化写法
- 在对象结束使用后 ,令obj = null;
 - js中开辟空间的操作有 new(),[ ],{ },function (){…},最大限度的实现对象的重用;
 - 慎用闭包,闭包容易引起内存泄露
 
js重复的问题 作用域链、原型、原型链、闭包? 面向对象 继承
面向对象:是一种编程思想,将现实世界的事物抽象为对象,并使用类和对象来创建各种功能
作用域链
内部环境可以通过作用域链来访问外部环境的属性和方法,但外部环境不能访问内部环境的任何属性和方法。注意,只能通过定义函数来延长作用域链条。
闭包
概念:闭包就是能够读取其他函数内部变量的函数,Javascript 语言中,只有函数内部的子函数才能读取局部变量,因此简单理解闭包为定义在一个函数内部的函数。本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
例子(如下代码所示):函数 b 就是一个闭包函数,用于获取函数 a 内部的变量 i。当函数 a 的内部函数 b,被函数 a 外的一个变量 c 引用的时候,就创建了一个闭包。
作用:可以读取函数内部的变量;让这些变量的值始终保持在内存中
1  | function a() {  | 
原型链
原型:所有函数都有一个特殊属性 prototype(原型),prototype 属性是一个指针,指向的是一个对象(原型对象),原型对象中的方法和属性都可以被函数的实例所共享。所谓函数实例是指以函数作为构造函数创建的对象,这些对象实例都可以共享构造函数的原型的方法。
原型链:原型链是用于查找引用类型(对象)的属性,查找属性会沿着原型链依次进行,找到后停止搜索并做相应的操作,否则会沿着原型链依次查找直到结尾。常见的应用是用在创建对象和继承中。



