攻略前端面试官(一):JS的数据类型和内存机制浅析
程序员文章站
2022-03-21 17:34:14
原文地址: "http://rainykane.cn/2019/09/29/与K_K君一起攻略前端面试官(一):JS的数据类型和内存机制浅析/" 背就完事了 介绍:一些知识点相关的面试题和答案 使用姿势:看答案前先尝试回答,看完后把答案收起来检验成果~ 问:JS有哪些数据类型 答:JS有七种数据类型 ......
原文地址:http://rainykane.cn/2019/09/29/与k_k君一起攻略前端面试官(一):js的数据类型和内存机制浅析/
背就完事了
介绍:一些知识点相关的面试题和答案
使用姿势:看答案前先尝试回答,看完后把答案收起来检验成果~
问:js有哪些数据类型
答:js有七种数据类型,分别是number、string、boolean、null、undefined、symbol、object。其中object是引用数据类型,其他都是值类型(基本数据类型)。引用数据类型又细分为function, array和object类型。问:如何理解值类型和引用类型
答:值类型占用空间固定,保存在栈里面,操作的是值本身;引用类型占用空间不固定,保存在堆中,操作的是指向对象的一个指针。问:如何理解堆(heap)栈(stack)
答:栈一般存放变量的值,堆一般存放复杂对象;栈的结构是先进先出,内存空间由系统自动分配和释放,堆的结构是先进后出,内存空间为动态分配,不主动释放的话,可能会由垃圾回收机制自动回收。问:null和undefined有什么区别
答:null是一个对象指针,但没有指向任何对象,通过typeof(null)
得到的是 object类型;undefined则是一个空值,通过typeof(undefined)
得到的是 undefined。
问:什么是浅拷贝和深拷贝
答:浅拷贝是只复制指向对象的指针,对新旧对象进行操作都会互相影响;而深拷贝则是创建一个新的对象,将原来的值一个个复制过来,与原对象不在同一内存地址。问:如何理解symbol类型,使用场景是什么
答:symbol的特点就是symbol类型只能通过symbol()这个方法返回得到,且symbol类型的值是绝对唯一的。使用场景是作为对象属性的key值。理解小帮手
介绍:总结性的图表或笔试题目和解析,让知识点更容易懂
关于值类型,引用类型和内存栈和堆的关系
如下图所示,a,b变量是值类型,c,d变量是引用类型。
在声明c,d变量时,会先创建相应的对象存放在堆内存中,再将其引用地址赋值给变量。
由此,这道常见面试题的答案显而易见
var a = { test : 10 } var b = a a.test = 20 此时b.test=?
关于null,{}和undefined的对比
描述 | 数据类型 | 强转boolean值 | |
---|---|---|---|
null | 指针,指向地址没有对象 | object | false |
{} | 指针,指向空对象 | object | true |
undefined | 值,未定义 | undefined | false |
关于浅拷贝和深拷贝的具体操作
日常大部分的拷贝动作都属于浅拷贝,包括直接赋值(=), 扩展运算符(...), array的concat操作, object的assign操作。
真正的深拷贝方法可以自己进行封装,循环判断每一个子项是否为引用类型,再进行复制。
也可以通过json.parse(json.stringfy(object))进行深拷贝
// 日常所见的浅拷贝操作 var a = { class: 1, teacher: { name : 'abc' }} var b = a var c = {...a} var d = object.assign({}, a) var e = json.parse(json.stringify(a)) a.class = 2 a.teacher.name = 'bcd' console.log(a) // 打印结果:{ class: 2, teacher: { name : 'bcd' }} console.log(b) // 打印结果:{ class: 2, teacher: { name : 'bcd' }} console.log(c) // 打印结果:{ class: 1, teacher: { name : 'bcd' }} console.log(d) // 打印结果:{ class: 1, teacher: { name : 'bcd' }} console.log(e) // 打印结果:{ class: 1, teacher: { name : 'abc' }}
通过以上代码可以看出..., object.assign, concat等操作只是第一层用新建的对象包裹住,子属性对象的引用地址还是和原来一致。
kane -- 一切都是命运石之门的选择
上一篇: Docker 数据卷管理
下一篇: 分布式事务之解决方案(最大努力通知)