js中的const 命令

一直以来我在我字典里认为const 命令就是用来声明一个常量,然后并非如此,这也是我在工作中偶然发现的,然后查了下文档才得知,记录在档,以供参考:

const 定义

const声明一个只读的常量 。一旦声明, 常量的值就不能改变。
常量 所谓的常量就是不能改变的值

const PI = 3.1415;
PI // 3.1415
PI = 3;
// TypeError: Assignment to constant variable.

上面代码表明改变常量的值会报错。

const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。
接下来让我们见证它的值是如何变得:

const 不为人知的秘密

并不是变量的值不能改动,而是指向的那个内存地址所保存的数据不得改动;数据一半存储在堆中,
对于简单的基本数据类型(string number boolean null undefined)值保存在指向的那个内存地址,因此等同于常量。
但对于引用数据类型(object array ),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针
是固定的(即指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能够控制了。

const foo = {};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only

上面代码中,常量foo储存的是一个地址,这个地址指向一个对象。不可变的只是这个地址,即不能把foo指向另一个地址,但对象本身是可变的,所以依然可以为其添加新属性。
continue 下面的示例:

const a = [];
a.push('Hello'); // 可执行
a.length = 0;    // 可执行
a = ['Dave'];    // 报错

上面代码中,常量a是一个数组,这个数组本身是可写的,但是如果将另一个数组赋值给a,就会报错。

如果真的想将对象冻结,应该使用Object.freeze方法。

const foo = Object.freeze({});// 常规模式时,下面一行不起作用;
// 严格模式时,该行会报错
foo.prop = 123;

上面代码中,常量foo指向一个冻结的对象,所以添加新属性不起作用,严格模式时还会报错。

除了将对象本身冻结,对象的属性也应该冻结。下面是一个将对象彻底冻结的递归函数。

var constantize = (obj) => {Object.freeze(obj);Object.keys(obj).forEach( (key, i) => {if ( typeof obj[key] === 'object' ) {constantize( obj[key] );}});
};

本文参考于阮老师ECMAScript 6 入门一书
不积硅步无以至千里。。。

js中的const 命令相关推荐

  1. Js中的const关键字

    const关键字 和 let 关键字一样都是有块级作用域. const声明一个只读的常量.一旦声明,常量的值就不能改变.一旦声明变量,就必须立即初始化,不能留到以后赋值. const foo; // ...

  2. js中let const var的区别

    1.var声明的变量会存在变量提升,而let 和 const的变量不会存在变量提升 也就是var声明的变量会被提升到他所在的作用域顶端去 // var: console.log(a) // 打印为 ' ...

  3. js中for(const i in/of arr/obj)和vue中v-for指令的区别

    在js中 var obj = {q:'qqq',w:'www',e:'eee'}var arr1 = [{r:'rrr'},{t:'ttt'},{y:'yyy'}]var arr2 = ['uuu', ...

  4. Commander.js中-h或help命令使用问题

    Commander.js中-h或help命令使用问题 program.usage() 中出现index 问题描述 & 现象 在使用commandName -h命令时(这里的commandNam ...

  5. node.js中公培训笔记大全(讲的一般,小白基础入门)

    day01 本阶段的授课内容为 ES6 2天-3天 NodeJS 2天-3天 express 2天-3天 webpack 1天 MySQL数据库 2天 实战项目 2天 今天的授课内容为 1.ES5-严 ...

  6. webpack打开项目命令_配置webpack中dev.env.js、prod.env.js,解决不同命令下项目启动和打包到指定的环境...

    前后端分离的项目开发中,我们有开发环境.测试环境.预生产环境和生产环境. 1.开发环境下调试接口的时候,一般都会有好几个接口地址(开发服务器上的,本地的,接口开发人员的,七七八八的接口地址),要根据情 ...

  7. uniapp 获取到js文件var一个变量怎么获取到这个变量值_浅析Js中const,let,var的区别及作用域...

    理解:let变量的作用域只能在当前函数中 js中const,let,var的区别及作用域_lianzhang861的博客-CSDN博客​blog.csdn.net 全局作用域中,用 const 和 l ...

  8. js使用const的好处_let和const命令

    let命令 块级作用域 ES6新增了let命令,用于声明变量,其用法类似于var,但是所声明的变量只在let命令所在的代码块内有效        像上面例子,var声明的i是全局的,全局只有一个i,所 ...

  9. 关于ES6中let 和 const 命令的用法以及注意事项:

    let命令: 基本用法: let定义: 用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. <script> //let代码块内部定义的变量,与var ...

最新文章

  1. 中了logo1.exe
  2. vue学习记录: 遇到过的问题记录
  3. 深入理解javascript 中的 delete(转)
  4. STL中map用法详解
  5. 对比Ruby和Python的垃圾回收(2):代式垃圾回收机制
  6. Ethercat解析(十四)之初始化流程
  7. Eigen--.block(i,j,p,q)
  8. json转string工具_不要再重复造轮子了,这款开源工具类库贼好使!
  9. Mathematica .nb程序运行不下去的原因
  10. 转换GridView的内容到Excel里面 ---带有格式
  11. loj10036. 「一本通 2.1 练习 2」Seek the Name, Seek the Fame
  12. c bool 类型检查_第3篇:C/C++ 检查数字类型的最高有效位(MSB)
  13. 吉林大学超星学习通02(1)
  14. 算法--职前算法复习
  15. vim命令下显示行号
  16. 【集训DAY3】挖金矿【二分答案】
  17. 免费域名邮箱申请教程
  18. HDU oj wod sticks
  19. spring5之IOC入门笔记
  20. 地图可视化“一网打尽“

热门文章

  1. 非关系型数据库mongoDB以及基础操作
  2. 海湾gst5000协议号_海湾JB-QB-GST5000消防主机操作步骤规程
  3. python执行sql查询脚本并填写到excel_用Python执行SQL、Excel常见任务?10个方法全搞定!...
  4. 《Hands-On Machine Learning》学习笔记-1.1 什么是机器学习
  5. 硬盘被搜 迅雷被指“盗窃用户文件”
  6. Git---当本地分支和远程分支都被删除时,如何处理?
  7. WMI系统管理工具介绍和获取机器码
  8. 【Scratch一级真题解析】电子学会等级考试一级(选择题)-2021年3月
  9. Latex使用ctex宏包没有隶书
  10. id文本框适应文字_id怎么把字体框的尺寸缩小