JavaScript是一种轻量级、解释型或者说即时编译型的编程语言, [20]广泛应用于网页开发中,主要用于增强网页的交互性动态性。作为Web开发的核心技术之一,它与HTMLCSS共同协作,HTML负责定义网页的内容结构,CSS处理样式和布局,而JavaScript则控制网页的行为和交互。

js的事件循环机制

js是单线程的,会出现阻塞问题。
比如说网络请求和 settimeout ,它通过异步来做的,若都用异步则会放在队列里面,异步队列没有优先级,所以为了更灵活增加了事件循环
事件循环:
js是单线程,有同步任务和异步任务,一般是异步任务又分为微任务和宏任务
先执行同步任务队列,再执行微任务队列,之后再执行宏任务,每执行一次宏任务时会时时检测微任务队列有没有任务,若有则会先清空微任务队列,执行完了,再去执行下一个宏任务。

运行机制:
单线程,从上到下按顺序执行代码。运行的两个阶段

  1. **预解析:**把所有的函数定义提前,所有的变量声明提前,变量的赋值不提前
  2. **执行:**从上到下执行(按照js运行机制)

javascript的数据类型

BooleannullStringNumberObjectUndefined
常见基本数据类型:NumberStringBooleanNullUndefined
基本数据类型是按值访问的,因为可以直接操作保存在变量中的实际值
引用类型:Object 、ArrayFunctionData等。

怎样判断变量的类型

typeof 能够区分除数组、对象和null外的所有类型,[] {} null 都返回object
instanceof 及原理:object.toString().call()

Cookie(4kb)、 storage (5MB) localStorage(5-10MB)

首先,webstorage中包含sessionStoragelocalStoragecookie和webstorage的区别:

  1. 出现的时间:cookie 很早之前就有了,webstorage H5之后才有的
  2. 跟随请求状态:cookie 会跟着前后台请求,webstorage 不跟随
  3. **储存大小:**cookie 4K,storage 5M左右
  4. **生命周期:**cookie 生命周期可以设置,webstorage 生命周期不可设置
  5. **存在的位置:**cookie / sessionStorage / localStorage 在客户端,seesion 在服务端,较其他的安全

操作数组和对象的常见方法

array slice / splice / concat / filter / map / reduce
obj keys / assign

示例:

1
2
3
4
const fruits = ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango'];
const citrus = fruits.slice(1, 3); // ['Orange','Lemon']
const removed = fruits.splice(2, 2, 'Kiwi', 'Pineapple'); //替换了原数组['Kiwi', 'Pineapple', 'Lemon', 'Apple', 'Mango']
//fruits.splice(2, 2) // ['Lemon', 'Apple']

new内部做了什么

  1. 创建了一个新对象 var obj = {}
  2. this关键字指向obj;
  3. prototype原型指向obj原型;
  4. 执行构造函数

防抖、节流 , 函数节流的应用场景

js 中一些事件如浏览器的 resizescroll,鼠标的 mousemovemouseover,input 输入框的 keypress事件在触发时,会不断地调用绑定在事件上的回调函数,极大地浪费资源,降低前端性能。为优化体验,需要对这类事件进行调用次数的限制。
**函数防抖:**在一段连续操作结束后,处理回调,利用 clearTimeoutsetTimeout实现
**函数节流:**每隔一段时间,只执行一次函数。
场景:

  1. 滚动加载,加载更多或滚到底部监听;
  2. 谷歌搜索框,搜索联想功能;
  3. 高频点击提交,表单重复提交

this指向

  1. 普通函数调用,此时 this 指向 window
  2. 构造函数调用,此时 this 指向 实例对象
  3. 对象方法调用,此时 this 指向 该方法所属的对象
  4. 通过事件绑定的方法,此时 this 指向 绑定事件的对象
  5. 定时器函数,此时 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function getPromise(value) {
return new Promise((resolve) => {
setTimeout(() => resolve(value), 1000);
});
}

getPromise(1).then((result) => {
console.log(result); // 输出: 1
return getPromise(result * 2);
}).then((result) => {
console.log(result); // 输出: 2
return getPromise(result * 3);
}).then((result) => {
console.log(result); // 输出: 6
}).catch((error) => {
console.error(error);
});

在 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
2
3
4
5
6
7
8
9
function a() {
var i = 0;
function b(){
alert(++i);
}
return b;
}
var c = a();
c()

原型链
原型:所有函数都有一个特殊属性 prototype(原型),prototype 属性是一个指针,指向的是一个对象(原型对象),原型对象中的方法和属性都可以被函数的实例所共享。所谓函数实例是指以函数作为构造函数创建的对象,这些对象实例都可以共享构造函数的原型的方法。
原型链:原型链是用于查找引用类型(对象)的属性,查找属性会沿着原型链依次进行,找到后停止搜索并做相应的操作,否则会沿着原型链依次查找直到结尾。常见的应用是用在创建对象和继承中。