大前端【1-2习题】ES 新特性与 TypeScript、JS 性能优化

模块二:ES新特性与TypeScript、JS性能优化

一、【简答题】请说出下列最终的执行结果,并解释为什么

var a = []
for(var i = 0;i<10;i++){
    
    
    a[i] = function(){
    
    
        console.log(i)
    }
}
a[6]()

答:最终输出结果:10,原因:使用var关键字定义的变量会存在变量提升的问题,即使i在循环条件中,但是执行完for循环以后并没有被空间释放,而是可以继续访问,并且i=10,调用的时候执行函数输出i,则输出10。

二、【简答题】请说出下列最终的执行结果,并解释为什么

var tmp = 123
if(true){
    
    
    console.log(tmp)
    let tmp
}

答:最终执行结果会报错,报错信息如下,在块级作用域中声明变量tmp,tmp就会被绑定到所在的块级作用域中,此作用域中,变量声明之前被调用,所以会报错,它不会受上层作用域同名变量的影响。

三、【简答题】结合ES6新语法,用最简单的方式找出数组中的最小值

var arr = [12,34,32,89,4]

答:使用sort函数进行排序

let getMin = (arr)=>arr.sort((a,b)=>a-b)[0]
getMin(arr) // 4

四、【简答题】请详细说明var、let、const三种变量声明的方式之间的差异

答:var、let、const是JavaScript中声明变量的三种方式

(1)作用域不同,var的作用域是是整个函数的,但let作用域是在块级作用域中。

(2)声明使用的顺序不同。let定义的变量必须要先声明然后再使用,否则会报错,但是var可以先使用后声明,不会报错。可以正常使用。

(3)变量提升。var定义的变量存在变量提升的情况,但let定义的变量,只能在作用域中使用,外部不可对其进行引用。

(4)重复定义。v变量可以多次使用var关键词进行定义,例如:var a = 1; var a = 2。但是被let修饰的变量只能被定义1次。多次定义会报错。

(5)修改。const定义的变量后续不可再次更改,如果定义的是对象的话,则对象内部的属性可修改,但指向的内存地址不能被更改。但是使用var、let则可以修改。

五、【简答题】请说出下列执行的最终结果,并解释为什么。

var a = 10
var obj = {
    
    
    a:20,
    fn(){
    
    
        setTimeout(()=>{
    
    
            console.log(this.a)
        })
    }
}
obj.fn()

答:20。obj调用fn函数时,fn函数中的this指向obj,定时器为箭头函数,this指向最近的函数this指向,所以this也指向obj,所以obj.a输出20。

六、【简答题】简述Symbol类型的用途

答:(1)保证唯一性。因为每一个Symbol的值都是不相等的,这就意味着Symbol的值可以作为标识符用于对象的属性名,就可以保证不会出现同名的情况。

(2)私有属性,定义私有属性,外部无法进行访问,只能通过类中的方法进行访问。

const name = Symbol('123')
const obj = {
    
    
    [name]:'123',
    sayHi(){
    
    
        console.log(this[name])
    }
}
console.log(obj.name) //不能直接访问
obj.sayHi() //只能调用其它非私有的方法

七、说说什么是浅拷贝,什么是深拷贝

答:浅拷贝:所谓的浅拷贝就是拷贝指向对象的指针(拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一块空间)。

浅拷贝只是一种简单的拷贝,让几个对象公用一个内存,然而当内存销毁的时候,指向这个内存空间的所有指针需要重新定义,不然会造成野指针错误

深拷贝:所谓的深拷贝指拷贝对象的具体内容,其内容地址是自助分配的,拷贝结束之后,内存中的值是完全相同的,但是内存地址是不一样的,两个对象之间相互不影响,也互不干涉.

八、请简述TypeScript与JavaScript之间的关系

答:JavaScript是一种脚本编写语言,无需编译,只要嵌入HTML代码中,就能在浏览器中加载执行。

TypeScript是JavaScript类型的超类,实现以面向对象编程的方式使用Javascript,它可以编译成纯JavaScript。

JavaScript能够直接在浏览器引擎和node.js上直接运行,但是TypeScript不可以。

九、请谈谈你所认为的TypeScript的缺点

答:(1)使用TypeScript,会增加工作量

(2)需要明确每一个变量或函数的类型,在编码过程中,会增加代码的编写量

十、描述引用计数的工作原理和优缺点

答:核心思想是设置引用数,判断当前引用数是否为0,引用关系改变的时候会修改引用数字,引用数字变为0立即回收。

优点:可以及时回收垃圾对象,减少程序卡顿的时间

缺点:需要维护表来存储引用数,如果引用数过多,则会带来一定的损耗,并且对于循环对象引用这种情况,及时没有被外部引用,也无法回收资源。

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

答:分为三个阶段,标记、清除、整理。在标记阶段,collector从mutator根对象开始进行遍历,对从mutator根对象可以访问到的对象都打上一个标识,一般是在对象的header中,将其记录为可达对象。而在清除阶段,collector对堆内存(heap memory)从头到尾进行线性的遍历,如果发现某个对象没有标记为可达对象-通过读取对象的header信息,则将对象的地址进行移动,使其在地址上连续,然后再回收。

十二、描述V8新生代存储区垃圾回收的流程

共分为六个步骤:

回收过程采用复制算法+标记整理算法,新生代内存区被分为两个等大小的空间,一个是使用空间为from,另一个为空闲空间to,活动对象存储于From空间,标记整理后将活动对象拷贝到To,From与To交换空间完成释放,至此完成存储区垃圾回收。

十三、描述增量标记算法在何时使用及工作原理

猜你喜欢

转载自blog.csdn.net/qiuqiu1628480502/article/details/107285088