# fed-e-task-01-01 **Repository Path**: frontend_site/fed-e-task-01-01 ## Basic Information - **Project Name**: fed-e-task-01-01 - **Description**: 函数式编程与 JS 异步编程、手写 Promise - **Primary Language**: JavaScript - **License**: ISC - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-05-17 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # fed-e-task-01-01 ## 3. var、let、const三者的区别 1. 使用`var`声明的变量,声明前使用不会报错,其作用域为该语句所在的函数内,在方法体外用var定义的变量其它方法可以共享,且存在变量提升现象,变量可提升成为window的属性,污染顶层对象; 2. 使用`let`、`const`声明的变量,其作用域为在该语句所在的代码块内,不存在变量提升;let不允许在相同作用域内,重复声明同一个变量; 3. 使用`const`声明的是常量,在后面代码中不能再修改该常量所指向的内存地址,但可以修改该内存空间中的数据(即修改该变量的属性),不存在变量提升,`const`不允许在相同作用域内,重复声明同一个变量。 ## 6. Symbol类型的用途 从根本上防止属性名的冲突,可以保证不会与其他属性名产生冲突。 ## 7. 浅拷贝与深拷贝 1. 深拷贝与浅拷贝的概念只存在于引用数据类型; 2. 引用数据类型:名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值; 3. 浅拷贝: 只是增加了一个指针指向已存在的内存地址,拷贝对象与被拷贝对象数据实际共用一个内存地址,即浅拷贝只在栈内存中复制数据; 4. 深拷贝:增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,从被拷贝数据的内存地址复制一份相同数据存放于新的内存中,即深拷贝在栈内存和堆内存中复制数据,并且指定其引用关系; ## 8. 如何理解JS异步编程,Event loop、宏任务、微任务 ### 1. JS异步编程 ​ JavaScript语言执行环境是“单线程”,在任务执行过程中,多个任务就必须排队等候,出现耗时久的任务,就会导致阻塞;为了解决这个问题,提出了“异步模式”,即后一个任务不等前一个任务执行完就执行,每个任务有一个或多个回调函数完成后续操作; ### 2. Event loop: Javascript单线程任务被分为**同步任务**和**异步任务**; 1. 所有同步任务都在主线程上执行,也可以理解为存在一个“**执行栈**”, 即同步任务会在调用栈中按照顺序等待**主线程**依次执行; 2. 异步任务会**在其他线程中执行**,在异步任务有了结果后,将其注册的回调函数放入任务队列中,等待主线程空闲的时候(调用栈被清空),被读取到栈内等待主线程的执行(一旦**执行栈**中所有同步任务执行完毕,就从**任务队列** 中读取“任务”加入到“执行栈”中); 3. 主线程不断的在循环上面的步骤; ### 3. 宏任务VS微任务 任务还可以分为**宏任务**和**微任务**; 宏任务:可以理解是每次执行栈执行的代码就是一个宏任务(包括每次从事件队列中获取一个事件回调并放到执行栈中执行,每一个宏任务会从头到尾将这个任务执行完毕,不会执行其它); 微任务: 可以理解是在当前任务执行结束后立即执行的任务; ## 10. typescript与javascript之间的关系 TypeScript是 JavaScript 的超集,包含了 JavaScript 的所有元素,可以载入 JavaScript 代码运行,并扩展了 JavaScript 的语法;TypeScript 可以使用 JavaScript 中的所有代码和编码概念,TypeScript 是为了使 JavaScript 的开发变得更加容易而创建的。 ## 11. typescript的优缺点 优点:TypeScript 增加了代码的可读性和可维护性;TypeScript 非常包容,支持ES6规范; 缺点:需要一定的学习成本;短期可能会增加一些开发成本,集成到构建流程需要一些工作量;可能和一些库结合的不是很完美;