作业part1-2

一、请说出下列最终的执行结果,并解释为什么。
在这里插入图片描述
答案: 10,函数执行时,输出的 i 是for循环中的变量 i,函数执行时,循环结束,变量 i 的值为10,故输出的 i 也就是 10。

二、请说出下列最终的执行结果,并将解释为什么。
在这里插入图片描述
答案: 将会提示错误,因为在 if 块级作用域中,存在 let 声明的 tmp 变量,但是在声明之前就使用了,let 声明变量不存在变量声明提升,因此将提示错误。

三、结合ES6新语法,用最简单的方式找出数组中最小值。
在这里插入图片描述
答案:

arr.reduce((v, n) => v < n ? v : n, Infinity)

四、请详细说明var,let,const三种声明变量的方式之间的具体差别。
答案: var,let,const 之间的差别从三方面来说明:

  1. 变量的作用域:var 声明的变量可以在当前作用域内使用,没有块级作用域的限制。而 let 和 const 只能在声明变量的块级作用域中使用。
  2. 变量的声明和使用:var 声明的变量可以先使用后声明,存在变量声明提升。而 let 和 const 变量必须先声明后使用,不存在变量声明提升。而且 var 声明的变量可以多次重复声明,let 和 const 在一个块级作用域内只能声明一次,重复声明会报错。
  3. 变量的可变性:var 声明的变量值可以随意修改,let 声明的变量变量在赋值之后也可随意修改,const 声明的变量一经赋值,就不能再修改。

五、请说出下列代码最终输出的结果,并解释为什么。
在这里插入图片描述
答案: 20,setTimeout中的执行函数是一个箭头函数,箭头函数内部没有this变量,其内部访问的this变量是外部函数的this,即 fn 方法中的this,方法执行时是通过 obj.fn() 的形式执行的,此时 fn 函数内部 this 指向的是 obj, 故 this.a 就是 obj.a 为 20。

六、简述 Symbol 类型的用途。
答案: Symbol 类型是ES2015新增类型,表示唯一。用途:

  1. 用作常量,作为 switch-case 的判断条件。
  2. 每次调用Symbol函数都会获得不同的 symbol 值,因此如果用作对象的属性时,在对象外面不能随意访问对象中的symbol属性,因此symbol 类型的属性具有良好的私密性,可以用作对象的私有变量。
  3. Symbol内置属性来覆盖对象特有的方法,如 Symbol.toStringTag覆盖toString 方法。
  4. Symbol.iterator来定义 Iterator 接口。

七、说说什么是浅拷贝,什么是深拷贝?
答案: 浅拷贝和深拷贝主要是对于引用类型的变量的拷贝存在差异。
浅拷贝: 浅拷贝拷贝的是物理地址,而不是地址内存储的值,只要在一处地方进行了修改操作,其他所有指向这个内存地址的变量访问到的值都会发生改变。
深拷贝: 深拷贝则是对内存中的值的拷贝,会将内存中的值拷贝一份放到其他地址。变量存储的物理地址是不同的,所以某一个变量的修改不会影响其他变量中的值。

八、请简述 TypeScript 和 javaScript 之间的关系。
答案: TypeScript 是 javaScript 的超集,除了包含 JavaScript 的功能还包括 ES6 和 类型校验系统。

九、请谈谈你说认为的 TypeScript 优缺点。
答案:
优点:

  1. 严格的类型检查,能够在编译器暴露一些错误,避免了因为数据类型不匹配而导致的执行错误。
  2. 方便开发工具智能提示,提供开发的准确性,提高开发效率。
  3. 接口及类的使用,方便进行协同开发。

缺点:

  1. 需要安装而外的插件来支持开发。
  2. 开发时需要为变量添加而外的类型注解,增加的开发的工作量。
  3. 开发完成之后还需要使用插件工具移除类型注解,增加了工作流程。

十、描述引用计数的工作原理和优缺点。
答案: 引用计数是通过为对象设置引用数,然后根据引用数是否为0来判断该对象是否应该被回收,而引用计数在引用关系发生改变时才会变化,被其他对象引用,则引用计数加1,如果删除该对象的引用则引用计数减1。
优点:

  1. 垃圾回收速度快,因为时刻监控对象引用计数的变化,所有当引用计数为 0 时,会立即回收垃圾
  2. 最大限度的减少程序的暂停:因为即刻回收垃圾,垃圾回收的时间被分摊,所以垃圾回收耗时小,减少了程序暂停。

缺点:

  1. 无法回收循环引用的对象。
  2. 需要维护引用计数,消耗的资源较大。

十一、描述标记整理的算法工作流程。
答案: 标记整理算法工作流程:

  1. 首先循环遍历对象,并标记活动对象。
  2. 移动活动对象位置,使其空间地址变得连续。
  3. 清理没有标记的对象,回收内存空间。

十二、 描述 V8 中新生代存储区垃圾回收的流程。
答案: V8 中新生代存储区是整个 V8 引擎分配到的内存空间二分之后较小的一片空间,一般在 64 bit 的操作系统中为32Mb,在 32 bit的操作系统中为 16 Mb。而新生代存储区由均分为两个大小相等的空间,from空间和to空间,其中 from 空间表示活动空间,to空间是空闲空间。
新生代存储区垃圾回收的流程:

  1. 活动对象存放在from空间。
  2. 当from空间利用率达到一定程度之后,对from空间的活动对象进行整理,使它们的地址连续。
  3. 将整理之后的from空间的活动对象复制到to空间,并回收from空间。
  4. to空间的对象在一轮GC之后还存活或to空间的使用率超出25%之后,将被移动到老生代空间。

十三、描述增量标记算法在何时使用及工作原理。
答案: 增量标记算法是在老生代进行垃圾回收时使用的,由于老生代空间较大,存储的对象较多,垃圾回收耗时较长,而垃圾回收又会阻碍 js 程序的执行,故此引入了增量标记算法。增量标记将垃圾回收操作碎片化,使得垃圾回收和 js 程序执行能够交替进行。增量标记算法过程:

  1. 遍历对象,并标记活动对象,但不会一次遍历完。
  2. 执行 js 程序。
  3. 重复上面的 1、2两步知道内存空间所有对象遍历标记完。
  4. 整理活动对象,并清除垃圾对象,回收空间,完成垃圾回收。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里提供一个简单的魔兽世界Part 1的C++代码示例,仅供参考: ```c++ #include <iostream> #include <string> using namespace std; // 定义士兵类 class Soldier { public: string name; // 名字 int health; // 生命值 int attack; // 攻击力 int id; // 编号 static int count; // 静态变量,记录士兵数量 // 构造函数 Soldier(string name, int health, int attack) { this->name = name; this->health = health; this->attack = attack; this->id = ++count; // 每次创建士兵时,编号自增 } // 获取士兵信息 string getInfo() { return "编号:" + to_string(id) + " 姓名:" + name + " 生命值:" + to_string(health) + " 攻击力:" + to_string(attack); } // 攻击敌人 void attackEnemy(Soldier& enemy) { cout << "编号为" << id << "的" << name << "攻击了编号为" << enemy.id << "的" << enemy.name << endl; enemy.health -= attack; if (enemy.health <= 0) { cout << "编号为" << enemy.id << "的" << enemy.name << "被" << name << "杀死了" << endl; } } }; int Soldier::count = 0; int main() { Soldier s1("张飞", 100, 20); Soldier s2("关羽", 120, 30); cout << s1.getInfo() << endl; cout << s2.getInfo() << endl; s1.attackEnemy(s2); s2.attackEnemy(s1); return 0; } ``` 以上代码实现了一个简单的士兵类,包括了姓名、生命值、攻击力和编号等属性,以及获取士兵信息和攻击敌人的方法。在main函数中创建了两个士兵对象s1和s2,并调用了它们的攻击敌人方法,输出了相应的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值