zoukankan      html  css  js  c++  java
  • 攻略前端面试官(一):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变量时,会先创建相应的对象存放在堆内存中,再将其引用地址赋值给变量。

    stack&heap

    由此,这道常见面试题的答案显而易见

    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 -- 一切都是命运石之门的选择

  • 相关阅读:
    最小的k个数
    数组中出现次数超过一半的数字
    字符串的排列
    二叉搜索树与双向链表
    复杂链表的复制
    二叉树中和为某一值的路径
    centos7安装wrk
    【胡思乱想】JNI与线程池的维护
    【胡思乱想】命令模式中,命令对象如何解耦Invoker和Receiver
    【胡思乱想】命令模式 与 Thread Runnable
  • 原文地址:https://www.cnblogs.com/rainykane/p/11974939.html
Copyright © 2011-2022 走看看