用const定义一个对象,看看和定义简单数据类型有什么不同。

const obj = {value: 36,name: 'SUR.E.',
}console.log(obj)obj.schoole = 'SYU' // 注意,这里改变了常量对象的内容console.log(obj)----------------------------------------------
{value: 36, name: 'SUR.E.'}
{value: 36, name: 'SUR.E.', schoole: 'SYU'} // obj对象被改变了?!

要寻找原因,需要知道JS中的变量和常量是如何存储的。

ES5当中有5种基本数据类型存在于栈内存当中:string 、number、boolean、undefined、null,JavaScript除基本数据类型外,还有引用数据类型,而引用数据类型存在于堆内存当中,而栈内容中存的是引用地址。看下图:

引用数据类型的引用地址不可以被改变,但是地址里存在的内容是可以被改变的。

再来看一下常量的Array,上代码:

const arr = [1, 2, 3]
arr.push(4) // 这里改变值console.log(arr)-----------------------
[1, 2, 3, 4] // 可以被改变

如何让常量引用数据类型的内容也不变量呢,要用到Object.freeze()注意只能冻结一层,下面会详细说什么叫只冻结一层),这个单词的本义是“冻结”,上代码:

const obj = {value: 36,name: 'SUR.E.',
}console.log(obj)// 开始冻结对象
Object.freeze(obj) // 注意,这里只能传入对象,不能传入数组obj.schoole = 'SYU' // 注意,这里改变了常量对象的内容console.log(obj)----------------------------------------------------------------
{value: 36, name: 'SUR.E.'}
{value: 36, name: 'SUR.E.'} // 没有报错,常量对象的内容也没有被改变

现在来修改一下代码,嵌套一个子对象skill,然后改变它的内容:

const obj = {value: 36,name: 'SUR.E.',skill: {name : 'code',year : 10 // ==>注意这里定义的是10}
}// 开始冻结对象
Object.freeze(obj) // 冻结obj.skill.year = 15 // 改为15console.log(obj)------------------------------------------
{value: 36, name: 'SUR.E.', skill: {…}}
name: "SUR.E."
skill:
name: "code"
year: 15 // 居然成功了?!
value: 36

所以,freeze()只能冻结当前层的对象,如果想冻结子层对象,还需要再写一行代码:

Object.freeze(obj)
Object.freeze(obj.skill) // 冻结第二层

冻结数据参考:

Object.freeze() - JavaScript | MDN

上面的网站不错,大家可以多看看Web 开发技术 | MDN

学习笔记 JavaScript ES6 声明方式const(二)相关推荐

  1. 学习笔记 JavaScript ES6 箭头函数

    学习内容: this指向定义时所在的对象,而不是调用时所在的对象 不可以当作构造函数 不可以使用arguments对象 1.this指向定义时所在的对象,而不是调用时所在的对象 先来回顾一下ES5当中 ...

  2. 学习笔记 JavaScript ES6 Promise的静态方法

    学习内容: Promise.resolve() Promise.reject() Promise.all() Promise.race() Promise.resolve(),表示成功的状态 Prom ...

  3. ES6学习笔记02:let 与 const

    ES6学习笔记02:let 与 const 用var声明的变量会造成全局污染,于是就产生了新的声明方式. 1.let 用let声明变量,必须先声明后使用. 在for循环头里用let定义循环变量i,那么 ...

  4. HTML5学习笔记 —— JavaScript基础知识

    HTML5学习笔记 -- JavaScript基础知识 标签: html5javascriptweb前端 2017-05-11 21:51 883人阅读 评论(0) 收藏 举报 分类: JavaScr ...

  5. 【学习笔记】C++ 核心编程(二)类和对象——封装

    内容来自小破站<黑马程序员C++>复习自用 [学习笔记]C++ 核心编程(二)类和对象--封装 4 类和对象 4.1 封装 4.1.1 封装的意义(一) 4.1.1 封装的意义(二) 4. ...

  6. php中声明一个函数,php学习笔记之 函数声明

    /* 函数定义: * 1.函数是一个被命名的 * 2.独立的代码段 * 3.函数执行特定任务 * 4.并可以给调用它的程序返回一个值 * * 函数的优点: * 1.提高程序的重用性 * 2.提高程序的 ...

  7. 深度学习笔记(17) 误差分析(二)

    深度学习笔记(17) 误差分析(二) 1. 使用来自不同分布的数据进行误差分析 2. 数据分布不匹配时的偏差与方差 3. 处理数据不匹配问题 1. 使用来自不同分布的数据进行误差分析 越来越多的团队都 ...

  8. CTFHUB http协议题目 学习笔记 详细步骤 请求方式 302跳转 cookie 基础认证 响应源代码

    CTFHUB http协议题目 学习笔记 详细步骤 请求方式 302跳转 cookie 基础认证 响应源代码 WEB-HTTP协议 1-请求方式 2-302跳转 3.cookie 4.基础认证 5.响 ...

  9. ASP.Net学习笔记004--基于ashx方式的ASP.Net开发1

    以前写的课程都没有附上源码,很抱歉! 课程中的源码可以加qq索要:1606841559 技术交流qq1群:251572072 技术交流qq2群:170933152 也可以自己下载: ASP.Net学习 ...

  10. 学习笔记 JavaScript 动画

    学习笔记 JavaScript 动画 结果 代码里用到的图片 <html><head><style>#imageDiv {height: 100px;width: ...

最新文章

  1. PCL中多个可视化窗口
  2. 十六届智能车全向组硬件开源 | 上海海事大学全向行进组
  3. CGRectInset CGRectoffset UIEdgeInsetsInsetRect 这三个函数的使用情况
  4. 他们调查了3.9万名程序员,制作了这份开发者技能报告
  5. SAP License:从SAP顾问面试看职场
  6. 三创赛优秀作品_创新藏在每一个细节里———记第三届3S杯全国大学生物联网技术与应用“三创”大赛一等奖获奖作品...
  7. 测试用例之场景法设计
  8. 软件测试之黑盒测试白盒测试
  9. centos7安装有道词典
  10. python变成灰色_Python怎么把彩色图像转换成灰色图像?
  11. html 自动切换tab栏,html 实现tab切换的示例代码
  12. R语言Circos图可视化
  13. 关于OneDrive一直显示“正在登陆”的一种可能解决方法
  14. Python用正则表达式根据格式匹配成语,如:AABB,AABC,ABAC......
  15. python生成6位验证码随机数,需包含英文字母大写、小写和数字(含代码和注释)
  16. 用Python写个空课表生成器-Excel文件操作实例
  17. P1146 硬币翻转 python题解
  18. 美女手机壁纸采集源码
  19. LeetCode #77 组合
  20. c++安全编写对象池中文版

热门文章

  1. Android Camera HAL3 - 开篇词
  2. npm安装依赖报错:npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\misal\AppData\R
  3. 51单片机 Keil C 延时程序的简单(晶振12MHz,一个机器周期1us.)
  4. 用Xbox360游戏手柄通过python代码控制树莓派4B点亮LED灯
  5. Craps 赌博游戏
  6. 30个Eclipse键盘快捷键大全,让你工作效率翻倍
  7. python 残差图_利用matplotlib绘制多元自变量的回归残差
  8. PR字幕模板 简单大气红色创意图形动态字幕条全屏标题pr模板
  9. POST请求下载文件
  10. gc2000导出丝印和坐标_GC2000导坐标方法