答:结果是10。因为for循环里的i是全局变量,for循环执行完之后,i已经变成了10,所以之后无论调用a几,输出的都是10。
答:结果报错,cannot access 'tmp' before initialization
原因:let 会形成块级作用域和封闭作用域,所以 tmp 无法拿到外层 var 声明的值,只能在块级作用域中查找。let 不会导致变量提升,因此console.log(tmp)无法找到声明,出现暂时性死区。
let arr = [12,65,9778,1,3546,5]
arr.sort((a, b) => a-b)[0]
arr.reduce((min,num)=>min<num?min:num)
Math.min(...arr)
var 缺点 1.有变量提升,未声明前可以使用,2.重复命名会覆盖,3.污染全局作用域,4.块级作用域,外面也能访问。
let 优点1.没有变量提升。2.未声明前不能使用。3.有自己的作用域。4,不会污染全局。
const 可以声明常量,值不能修改,但是引用类型的属性可以修改。必须初始化。和let一样有自己的作用域,不允许有同名的变量。
答:打印20。因为setTimeout是箭头函数,里面的this指向没有改变和fn函数里的this是一致的都指向obj,所以会输出20
- 作为对象的属性,可以作为对象的私有属性,
- 阻止对象上属性名的冲突,每个 Symbol 都独一无二的,可以保证不与其他属性名产生冲突,
- 使用Symbol来替代常量
- 浅拷贝:针对 Object,Array 这种复杂数据类型,浅拷贝复制一层对象的属性,属性中的值是基本数据类型直接复制值,如果是引用类型复制内存地址的指针,所以在修改复制后的变量里引用类型的里面的值时,会导致原始数据也被修改
- 深拷贝:针对 Object,Array 这种复杂数据类型,深复制递归复制了所有的层级,新数据和原始数据不存在联系,因此在修改复制后的变量里引用类型的里面的值时,不会导致原始数据也被修改
答:TypeScript 并不是一个完全新的语言, 它是 JavaScript 的超集,为 JavaScript 的生态增加了类型机制,并最终将代码编译为纯粹的 JavaScript 代码。
| TypeScript | JavaScript |
|---|---|
| JavaScript 的超集用于解决大型项目的代码复杂性 | 一种脚本语言,用于创建动态网页。 |
| 可以在编译期间发现并纠正错误 | 作为一种解释型语言,只能在运行时发现错误 |
| 强类型,支持静态和动态类型 | 弱类型,没有静态类型选项 |
| 最终被编译成 JavaScript 代码,使浏览器可以理解 | 可以直接在浏览器中使用 |
| 支持模块、泛型和接口 | 不支持模块,泛型或接口 |
| 支持 ES3,ES4,ES5 和 ES6 等 | 不支持编译其他 ES3,ES4,ES5 或 ES6 功能 |
| 社区的支持仍在增长,而且还不是很大 | 大量的社区支持以及大量文档和解决问题的支持 |
| TS优缺点 |
有类型检查,属于强类型语言,优点,项目后期利于维护,重构,使代码更健壮,更智能的代码提示。
缺点,项目初期开发耗时,不利于小型项目
优点:
- 任何一种 javascript 运行环境都支持
- 功能更为强大,生态更健全、更完善
- TypeScript 属于渐进式的
- 增强代码的可读性和可维护性,增强了编译器和 IDE 的功能,定义可以作为文文档
- 在编译阶段就可以发现大部分大错误,不需要在运行时才发现
缺点:
- 语言本身多了很多概率,提高学习成本
- 项目初期,TypeScript 增加开发成本
- 集成到构建流程需要一些工足量
- 可能和一些库结合不完美,需要单独添加一些声明,不过大部分的库都支持了 TypeScript
工作原理:设置引用数,判断当前引用数是否为 0,引用关系改变时修改引用数字
优点:
- 发现垃圾时立即回收
- 最大限度减少程序暂停(保证空间不会被占满)
缺点:
- 无法回收循环引用的对象
- 时间开销大(监控对象,维护引用数)
标记整理 分为三个阶段,标记清除一样,阶段一,遍历标记引用的对象(从根找到可达活动对象),阶段二开始前移动对象整理后(遍历清除对象)
-
遍历所有对象找标记活动对象
-
清除阶段会先执行整理,移动对象位置,将活动对象放在一起
-
清除没有标记的对象,同时把第一次遍历所做的标记抹掉
-
把回收的空间放到空闲列表上面,方便后续程序申请空间使用
优点: 减少了内存空间的碎片化,缺点: 不能立即回收对象 新生代立即回收流程
增量标记
原理:是标记整理的增强,
和标记整理不同的是,增量标记标记阶段可以和程序互相进行,
直到程序结束才一起清除。
使用 :一般在老生代使用,适合处理大内存场景