es6基础复习

86 阅读9分钟

let var const

  • let 声明的变量是块级作用域,并且不和window挂钩
  • var 声明的全局变量会和 window 挂钩,即 var a=1, 则 window.a=1
  • const 声明的常量,不能被修改

var 和 let 的区别 ( 5个区别 ) ?

  • 作用域
    • let 声明的变量只在 ( 块级作用域 ) 中有效
    • var 声明的变量在代码块外也能访问
  • 变量提升
    • var 声明的变量存在 变量提升
    • let 不存在变量提升,即 ( 不能先访问再声明 )
  • 暂时性死区
    • let 声明的变量存在暂时性死区
    • var 不存在暂时性死区
  • 重复声明
    • let 不能重复声名同一个变量
    • var 可以重复声名
  • 是否和 ( 顶层对象window,浏览器环境 ) 挂钩
    • let 声明的全局变量不会和window挂钩
    • var 会和window挂钩,即 var a=1 声明的全局变量,可以通过 window.a 来访问

变量提升

优先级:形参 > 函数声明 > 变量声明

  • 函数名已经存在,则新的覆盖旧的 - 变量名已经存在,则跳过变量声明(注意:只是跳过变量的声明,赋值是正常的赋值)

箭头函数和普通函数有什么区别

箭头函数没有自己的this,arguments,super,prototype,无法使用new实例化对象,不能作为构造函数,
不能使用yield命令,没有prototype属性,不能使用call,apply,bind改变this指向,

箭头函数的this指向定义时所在的对象,指向当前所处词法作用域的this
普通函数的this指向调用时所在的对象,因为没有this,所以不能作为构造函数,不能使用 new 命令

函数内部可以使用arguments对象来访问函数的参数列表,箭头函数没有arguments对象,可以使用rest参数来代替arguments对象

箭头函数使用简洁的语法来定义函数 省略function和大括号 如果只有一个参数 还可以省略括号 如果函数体只有一个表达式 可以省略大括号和return关键字

import 和require的区别

将一个模块引入到当前模块中 import 语句在导入模块时会进行静态解析,通过静态分析代码来确定导入的模块,只能在顶层使用,不能在条件语句或循环中使用。
而 require 函数在运行时根据传入的模块路径动态加载模块,可以在代码的任何位置使用。

模板字符串

生成器generator

js三座大山

原型和原型链
作用域和闭包closure
异步编程

js数据类型

基本数据类型: number,string,boolean,null,undefined,symbol,bigint
引用数据类型: object

js数据类型检测

typeof
instanceof
Object.prototype.toString.call()

原型和原型链

原型: 每个对象都有一个原型对象,通过原型对象可以访问到其他对象的方法和属性
原型链: 当一个对象需要访问某个属性或方法时,首先会在自身查找,如果找不到就会去原型对象中查找,如果原型对象中也没有就会去原型对象的原型对象中查找,以此类推,直到找到为止,这个过程就是原型链

作用域和闭包

作用域: 作用域是指变量或函数在代码中可访问的范围,分为全局作用域和局部作用域 闭包: 闭包是指函数内部可以访问函数外部(另一个函数作用域)的变量,闭包可以用来封装私有变量和函数,也可以用来实现模块化编程

用途:封装私有变量 做缓存(保护内部环境作用域) 模块化编程
缺点:内存泄漏 闭包会导致内存泄漏,因为闭包会引用外部函数的变量,如果外部函数的变量没有被释放,那么闭包中的变量也不会被释放,导致内存泄漏

应用场景

  • 模块化:封装私有变量(如单例模式)
  • 高阶函数:实现柯里化、防抖/节流等

柯里化,就是将接受多个参数的函数变换成接受一个单一参数的函数。

闭包的应用场景就是函数柯里化。(延长变量的生命周期)
参数复用,利用闭包将函数的参数储存起来,等参数达到一定数量时执行函数 
fn(x, y) -> fn(x)(y) 上面的代码就是把fn函数做成嵌套函数,外层函数的返回值是内层函数。外层函数调用完之后,能接着调用。 涉及到的概念,高阶函数,闭包,call/apply,argument。

柯里化执行函数的核心是:有参数传入时,收集参数,返回函数;收集参数完毕,执行,返回值。

闭包可以用来创建私有变量和方法,这些私有成员可以通过特定的公共方法进行访问和操作。这种模式有时被称为“模块模式”,它利用了闭包来隐藏对象的内部状态,并通过原型链暴露必要的接口

异步编程

异步编程是指程序在执行过程中可以同时执行多个任务,而不需要等待一个任务完成后再执行下一个任务,常见的异步编程方式有回调函数、Promise、async/await

js事件循环

事件循环是指浏览器或Node.js在执行代码时的一种机制,它会将代码分为同步任务和异步任务,同步任务会立即执行,异步任务会先被放入任务队列中,等到同步任务执行完毕后再执行任务队列中的任务,这个过程会不断重复,直到任务队列为空

js模块化

模块化是指将代码分割成多个独立的模块,每个模块都有自己的作用域和依赖关系,模块化可以提高代码的可维护性和可复用性,常见的模块化方式有CommonJS、AMD、ES6模块等

js内存泄漏

内存泄漏是指程序在运行过程中,由于疏忽或错误导致内存无法被正确回收,导致内存占用不断增加,最终导致程序崩溃或性能下降,常见的内存泄漏原因有全局变量、闭包、定时器、DOM元素等

js垃圾回收机制

垃圾回收机制是指程序在运行过程中自动回收不再使用的内存空间,常见的垃圾回收算法有标记-清除算法、引用计数算法等,垃圾回收机制可以避免内存泄漏的问题,但也会带来一些性能上的开销

babel

支持源代码转化为目标代码
jsx转化为普通js语法 jsx允许直接在js代码中编写类似html的语法,
在实际开发过程中jsx在产品打包阶段就一件编译成纯js了
转化后的js语法 polyfill 引入额外代码 使新功能在旧浏览器可用

webpack

webpack是一个现代JavaScript应用程序的静态模块打包器 webpack通过一个或多个入口点构建一个依赖图(dependency graph)然后将你项目中所需的每一个模块组合成一个或多个bundle webpack的作用是把scss转换为css,把jsx转换为浏览器可以识别的js,然后浏览器才能正常使用;

防抖节流

防抖:是指在事件触发后的一段时间内,如果再次触发事件,则重新计时,只有当事件触发后的一段时间内没有再次触发事件时,才会执行回调函数,
防抖可以避免频繁触发事件导致的性能问题
通过防抖函数让某个触发事件在 n 秒内只会被执行一次。

节流:是指在一段时间内,只允许事件触发一次,如果在这段时间内再次触发事件,则不会执行回调函数, 节流可以限制事件触发的频率,避免性能问题
一个单位时间内最多只能触发一次函数执行,如果这个单位时间内多次触发函数,只能有一次生效。

防抖应用场景

防抖适合多次事件一次响应的情况。

比较典型的有搜索事件,用户在不断输入值时,用防抖来节约请求资源,只有最后一次回车才能返回结果。还有按钮点击事件,为了防止用户多次重复提交也会使用防抖函数。最后就是部分的电话号码输入的验证,要等停止输入后才会进行一次验证。

节流应用场景

节流适合大量事件按时间做平均分配触发。

比较典型的有监听滚动或 resize 事件,比如是否滑到底部自动加载更多,调整窗口大小。另外还有一个就是像掘金写文章这里一样,有自动保存功能,我们一边写,它可以一边保存。剩下就比如说 DOM 元素拖拽,以及游戏中的刷新率都是会使用到节流函数的。

防抖和节流能有效减少浏览器引擎的损耗,防止出现页面堵塞卡顿现象

http的get和post区别

GET 请求主要用于获取数据,参数附加在 URL 中,存在长度限制,且容易被浏览器缓存,有安全风险;而 POST 请求用于提交数据,参数放在请求体中,适合提交大量或敏感的数据。

另外,GET 请求是幂等的,多次请求不会改变服务器状态;而 POST 请求不是幂等的,可能对服务器数据有影响。