# fed-e-task-01-02 **Repository Path**: sfl001/fed-e-task-01-02 ## Basic Information - **Project Name**: fed-e-task-01-02 - **Description**: part1模块二答题内容 - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-11-07 - **Last Updated**: 2021-03-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 简答题 ## 题目一 答:执行结果为 10;var 导致 i 的变量提升为全局变量,所以 i 的值在不停的变化,直到循环结束 i 的值就为 10 ## 题目二 答:会抛出错误 Cannot access 'tmp' before initialization;因为在 if 作用域块中,使用 let 不存在变量提升,虽然外部声明了 tmp,但是语句块内部声明优先级较高 ## 题目三 答: ```js var arr = [12, 34, 32, 89, 4] console.log(Math.min(...arr)) ``` ## 题目四 答:var 声明变量存在会导致变量提升,造成重复声明,变量污染的问题;let 声明变量是有作用域的,不会造成变量提升,声明了以后不能再重复声明相同名称的变量,初始化的值还可以修改;const 也是有作用域的,不会造成变量提升,并且一但声明后,对普通值类型而言是不可更改值的,对引用类型除外 ## 题目五 答:输出 20;因为 fn 的执行上下文是 obj,而 setTimeout 中的函数采用的是箭头函数,this 不会发生改变,任然指向父函数的上下文对象,所以这里 this.a===obj.a ## 题目六 答:用来声明变量属性的唯一性 ## 题目七 答: 浅拷贝:只是拷贝了一个对象中的普通值类型,对于对象中的引用类型则只是拷贝了其引用地址,当源对象的引用类型属性的值发生改变,拷贝后的目标对象中的引用类型属性的值也会发生变化;实现浅拷贝的方法:Object.assgin() 深拷贝:对一个对象中的普通值类型和引用类型都进行了拷贝,被拷贝的对象中的任何内容发生变化,不会影响拷贝目标对象的内容值变化;实现深拷贝的方法:JSON.parse(JSON.stringify()),自定义方法 ## 题目八 答:JS 是弱类型语言,变量的声明可以随意更改。TS 是 JS 的超集,是对 JS 的增强。 ## 题目九 答: 优点: - 增加代码的可维护性 - 兼容 js 语法 - 减少了一些不必要的类型判断 - 有智能提示,提高开发效率 缺点 - 学习和开发成本比较高 - 与部分第三方库需要兼容 ## 题目十 答: 优点: - 发现垃圾立即回收 - 快速回收内存,最大限度减少程序暂停 缺点: - 无法回收循环引用对象 - 空间浪费,增加引用计数的变量 - 时间开销大,引用对象越多,计数所花时间越大 ## 题目十一 答:遍历所有对象标记活动对象;遍历所有对象,标记所有活对象,清除没有标记对象;回收相应空间 ## 题目十二 答:回收过程采用复制算法+标记整理算法;新生代内存区分为两个等大小的空间;使用空间为 From,空闲空间为 To;标记整理后将活动对象拷贝至 To;From 与 To 交换空间完成释放 ## 题目十三 答:将一整段垃圾回收操作分成几个小段,垃圾回收与程序执行交替完成,程序执行一段时间后,产生垃圾对象,开始遍历对象进行标记,第一次标记可能就标记第一层活动对象,第二次标记所有活动对象,最后对空间进行回收。