学习笔记 JavaScript ES6 声明方式const(二)
用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(二)相关推荐
- 学习笔记 JavaScript ES6 箭头函数
学习内容: this指向定义时所在的对象,而不是调用时所在的对象 不可以当作构造函数 不可以使用arguments对象 1.this指向定义时所在的对象,而不是调用时所在的对象 先来回顾一下ES5当中 ...
- 学习笔记 JavaScript ES6 Promise的静态方法
学习内容: Promise.resolve() Promise.reject() Promise.all() Promise.race() Promise.resolve(),表示成功的状态 Prom ...
- ES6学习笔记02:let 与 const
ES6学习笔记02:let 与 const 用var声明的变量会造成全局污染,于是就产生了新的声明方式. 1.let 用let声明变量,必须先声明后使用. 在for循环头里用let定义循环变量i,那么 ...
- HTML5学习笔记 —— JavaScript基础知识
HTML5学习笔记 -- JavaScript基础知识 标签: html5javascriptweb前端 2017-05-11 21:51 883人阅读 评论(0) 收藏 举报 分类: JavaScr ...
- 【学习笔记】C++ 核心编程(二)类和对象——封装
内容来自小破站<黑马程序员C++>复习自用 [学习笔记]C++ 核心编程(二)类和对象--封装 4 类和对象 4.1 封装 4.1.1 封装的意义(一) 4.1.1 封装的意义(二) 4. ...
- php中声明一个函数,php学习笔记之 函数声明
/* 函数定义: * 1.函数是一个被命名的 * 2.独立的代码段 * 3.函数执行特定任务 * 4.并可以给调用它的程序返回一个值 * * 函数的优点: * 1.提高程序的重用性 * 2.提高程序的 ...
- 深度学习笔记(17) 误差分析(二)
深度学习笔记(17) 误差分析(二) 1. 使用来自不同分布的数据进行误差分析 2. 数据分布不匹配时的偏差与方差 3. 处理数据不匹配问题 1. 使用来自不同分布的数据进行误差分析 越来越多的团队都 ...
- CTFHUB http协议题目 学习笔记 详细步骤 请求方式 302跳转 cookie 基础认证 响应源代码
CTFHUB http协议题目 学习笔记 详细步骤 请求方式 302跳转 cookie 基础认证 响应源代码 WEB-HTTP协议 1-请求方式 2-302跳转 3.cookie 4.基础认证 5.响 ...
- ASP.Net学习笔记004--基于ashx方式的ASP.Net开发1
以前写的课程都没有附上源码,很抱歉! 课程中的源码可以加qq索要:1606841559 技术交流qq1群:251572072 技术交流qq2群:170933152 也可以自己下载: ASP.Net学习 ...
- 学习笔记 JavaScript 动画
学习笔记 JavaScript 动画 结果 代码里用到的图片 <html><head><style>#imageDiv {height: 100px;width: ...
最新文章
- PCL中多个可视化窗口
- 十六届智能车全向组硬件开源 | 上海海事大学全向行进组
- CGRectInset CGRectoffset UIEdgeInsetsInsetRect 这三个函数的使用情况
- 他们调查了3.9万名程序员,制作了这份开发者技能报告
- SAP License:从SAP顾问面试看职场
- 三创赛优秀作品_创新藏在每一个细节里———记第三届3S杯全国大学生物联网技术与应用“三创”大赛一等奖获奖作品...
- 测试用例之场景法设计
- 软件测试之黑盒测试白盒测试
- centos7安装有道词典
- python变成灰色_Python怎么把彩色图像转换成灰色图像?
- html 自动切换tab栏,html 实现tab切换的示例代码
- R语言Circos图可视化
- 关于OneDrive一直显示“正在登陆”的一种可能解决方法
- Python用正则表达式根据格式匹配成语,如:AABB,AABC,ABAC......
- python生成6位验证码随机数,需包含英文字母大写、小写和数字(含代码和注释)
- 用Python写个空课表生成器-Excel文件操作实例
- P1146 硬币翻转 python题解
- 美女手机壁纸采集源码
- LeetCode #77 组合
- c++安全编写对象池中文版
热门文章
- Android Camera HAL3 - 开篇词
- npm安装依赖报错:npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\misal\AppData\R
- 51单片机 Keil C 延时程序的简单(晶振12MHz,一个机器周期1us.)
- 用Xbox360游戏手柄通过python代码控制树莓派4B点亮LED灯
- Craps 赌博游戏
- 30个Eclipse键盘快捷键大全,让你工作效率翻倍
- python 残差图_利用matplotlib绘制多元自变量的回归残差
- PR字幕模板 简单大气红色创意图形动态字幕条全屏标题pr模板
- POST请求下载文件
- gc2000导出丝印和坐标_GC2000导坐标方法