在看const定义常量的时候发现,const定义基本类型的时候,再改变该值会报错,但是定义对象或数组的时候,对象和数组改变却不会报错,es6里的解释是const保存的是指向数组或对象的指针。我又搜了下栈内存和堆内存,发现其实变量保存的基本类型和引用类型的指针都是放在栈内存里的,const实质是不是就是栈内存不能变,而对象和数组的指针存在栈内存里没变,但是存在堆内存的数据本体随便更改是没事的?

回答

跟堆与栈没有关系, 真正的区别在于简单数据类型和引用数据类型的差异

假设有两个变量a和obj,分别是Number和Object类型

var a = 2var obj = {
prop: 5}

严格来说, JS并没有区分什么数据类型放在堆,什么数据类型放在栈(不过你可以这么想, 这里我们就假设简单数据类型是在栈,引用数据类型是在堆)

整个内存的分配你可以这么假想(实际的比这复杂得多):

对于a, 就是栈上存一个a变量, a存储的值为2对于obj,可以拆分成两部分, QQ号码卖号地图一部分是堆中(也就是{prop: 5})这一部分, 另一部分在栈中(obj这一部分)。这里我们不分析堆中的, 只管栈这一部分,那么obj可以看成是一个存储这地址的“简单数据类型”(因为一个地址占的字节数和简单数据类型差不多),obj的值为0x10000000这样假设执行obj.prop = 6, 实际上是改变了{prop: 5}这一部分, 而obj的值并没有改变。依然是0x10000000, 数组的原理与之类似当你执行obj = {key: 'foo'}, 是在堆中开辟了一个新的对象,然后把地址赋给了obj, 那obj的值肯定就变了, 那以前{prop: 5}这一部分去哪里了呢? 被垃圾回收给清除了

1,如果是值类型,值不可变
2.如果是引用类型,地址不可变

一句话:指针不变
简单来说:不能再用=。但是对于数组、对象、函数、正则、Set、Map之类的可以更改、删除属性(configurable为true的情况)


更多相关文章

  1. 【前端】js如何获取tree型数组的最大深度呢?
  2. js语法:数据类型、函数,作用域/作用域链、闭包
  3. 八大数据类型
  4. PHP基础:变量和数据类型
  5. PHP函数的使用
  6. 循环读取数组
  7. PHP数据类型及开发环境部署
  8. 初始 php 及认识 php 变量与数据类型
  9. 第十二课 数组循环

随机推荐

  1. PostgreSQL+pgpooll+Keepalived双机HA方
  2. 如何以小时为单位从oracle数据库中获取数
  3. 关于SQL注入的一些问题...URL注入....
  4. 如何用sql语句查询出当月的每日数据量
  5. 关系代数(Relation Algebra)与SQL语句的对
  6. MySQL如何锁定一条记录?
  7. javaweb JDBC连接Mysql与Oracle的比较及
  8. 在tomcat5.0下关于JDBC连接mysql的讨论
  9. mysql 无法远程登陆解决办法
  10. mysql 拆分字符串,并count出字符串的长度