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

  • 相关阅读:
    atitit.nfc 身份证 银行卡 芯片卡 解决方案 attilax总结
    atitit.php 流行框架 前三甲为:Laravel、Phalcon、Symfony2 attilax 总结
    Atitit.执行cmd 命令行 php
    Atitit. 图像处理jpg图片的压缩 清理垃圾图片 java版本
    atitit。企业组织与软件工程的策略 战略 趋势 原则 attilax 大总结
    atitit. 管理哲学 大毁灭 如何防止企业的自我毁灭
    Atitit.java的浏览器插件技术 Applet japplet attilax总结
    Atitit.jquery 版本新特性attilax总结
    Atitit. 软件开发中的管理哲学一个伟大的事业必然是过程导向为主 过程导向 vs 结果导向
    (转)获取手机的IMEI号
  • 原文地址:https://www.cnblogs.com/rainykane/p/11974939.html
Copyright © 2011-2022 走看看