js - 09 JS数据类型的区别

堆栈底层机制

思考:

1.  let a = 1;                    2. let n = {name: "xxx"};
    let b = a;                       let m = n;
    b = 2;                           m = {name: "xxxxxx"};
    console.log(a)                   console.log(n)

浏览器执行代码

步骤

  • 从电脑内存中分配出一块内存,用来执行代码,称:栈内存(stack)
  • 分配一个主线程用来自上而下执行js代码

图解思考1

栈内存.png
  • 创建变量a,放到当前栈内存变量储存空间中
  • 创建一个值1,并把他储存到当前值储存空间中(简单的基本类型值就是这样直接储存,引用其他复杂的类型就不能直接储存)
  • “=”为赋值的意思,其实就是让变量和值相互关联的过程
上述第一题console.log(a) // => 1

图解2

堆内存.png
  • 创建一个变量n,并在栈内存之外创建一个内存,用于储存引用类型值,称为堆内存(heap)=>内存中有一个16进制地址
  • 把对象中的键值对(属性名:属性值)依次储存到堆内存中
  • 将变量和对内存地址关联起来
  • 上述第二题中,m = {name:“xxxxxx”},此时堆内存中就有两个’name‘,又因为属性名不能同名,所以name:'xxx'被name:'xxxxxx'替换
  • 综上,上述第二题中console.log(n) =>name:'xxxxxx'

总结

  • 基本类型:按值操作(直接操作),所以也叫作值类型
  • 引用类型:操作的是堆内存的地址(按引用地址操作)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,871评论 1 32
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 8,008评论 2 9
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 12,386评论 0 27
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 8,746评论 0 6
  • 事实是会后才想清晰当时应怎么应对!!! 事实是紧张过后才认为当时的反应不对及觉得当时应该怎么反应!! 事实是只要对...
    卢默阅读 2,325评论 0 1

友情链接更多精彩内容