const是真的不能被改变吗?它什么不可以改,什么可以改?原理是什么?经常会有面试官问到这个问题,我们很多时候并不能够准确清楚的描述出来,下面我们一起来带着这三个问题去深入研究一下const。

菜鸟教程上关于const 是这样描述的:

ES2015(ES6) 新增加了两个重要的 JavaScript 关键字: let 和 const。
let 声明的变量只在 let 命令所在的代码块内有效。
const 声明一个只读的常量,一旦声明,常量的值就不能改变

const 用于声明一个或多个常量,声明时必须进行初始化,且初始化后值不可再修改:

const 声明的常量必须初始化:

// 错误写法
const PI;
PI = 3.14159265359;
// 正确写法
const PI = 3.14159265359;
初始化后值不可再修改:
const PI = 3.141592653589793;
PI = 3.14;      // 报错
PI = PI + 10;   // 报错
  1. const的本质
    const 的本质: const 定义的变量并非常量,并非不可变,它定义了一个常量引用一个值。使用 const 定义的对象或者数组,其实是可变的。下面的代码并不会报错:
// 创建常量对象
const car = {type:"Fiat", model:"500", color:"white"};// 修改属性:
car.color = "red";// 添加属性
car.owner = "Johnson";// 创建常量数组
const cars = ["Saab", "Volvo", "BMW"];// 修改元素
cars[0] = "Toyota";// 添加元素
cars.push("Audi");

错误的是对对象/数组重新赋值:

const car = {type:"Fiat", model:"500", color:"white"};
car = {type:"Volvo", model:"EX60", color:"red"};    // 错误const cars = ["Saab", "Volvo", "BMW"];
cars = ["Toyota", "Volvo", "Audi"];    // 错误
  1. 探究const的内部逻辑
    const 声明的变量如果是基本类型,那么不允许改变,如果是引用类型,那么只要不改变引用的地址就是可以的。也就是说其实const保证的并不是变量的值不动,而是变量指向的内存地址不得改动。

例如:

const message = ‘hello’

js看到变量message后,会给message分配一个内存空间0001
看到等号右侧的字符串‘hello'时,会立马给它分配另一个内存空间,并把‘hello'放到这个这个内存空间里0004
js会记录这个内存地址0004
把这个内存地址0004放到message这个内存里,这时message中存储的就是hello字符串的存储地址0004(即指针)

//欲修改const类型的message、会报错
message = 'word' //错误
如果运行以上代码,js会将存储‘word'字符串的地址(假如是0003)赋给message,而message又是用const定义的变量,不可以改变变量里存储的内存地址。所以修改会报错。

所以只要看const指向内容不变,那就可以了。例如:

// 创建常量对象

const car = {    type:"Fiat", model:"500", color:"white"
};// 修改属性:
car.color = "red";// 添加属性
car.owner = "Johnson";

所以保持引用不变,对象的属性进行修改,或者增加属性都对引用没有影响。但是如果对对象重新赋值,那引用地址是会被改变的。如下示例代码:

<script>car ={type:"Fiat",model:"500",color:"white"};console.log(car)//让car2指向car对象的地址,car2 = carconsole.log(car2)console.log(car === car2) //true//接着我们来改car对象,就是对car重新赋值car = {type:"xxx",model:"800",color:"red"}console.log(car)//然后我们比较之前的car引用和重新赋值的car引用是不同的//说明car重新赋值后是会改变引用地址的,跟单纯去修改属性值,添加属性等操作完全不同。console.log(car2 === car) //false</script>

以上关于const的深入理解部分 转载自 小柒很爱喵 的CSDN博客,感兴趣的可以去看看!!!
https://blog.csdn.net/weixin_41950078/article/details/115178560

深入了解const !!!相关推荐

  1. c/c++中的const

    关于const能否修改 c语言 #include <stdio.h> int main() {const int i = 10;//const int i; //错误,const变量必须在 ...

  2. 微信小程序var,let,const的区别

    var 用var的方式声明的变量,为全局变量 let 声明块级变量,即局部变量 const 用于声明常量,也具有块级作用域 const PI=3.14;

  3. js中定义变量之②var let const的区别

    var 上一篇文章有讲过,是js定义变量的关键词. 但是在es6中,新添加了两个关键词,用于变量声明的关键词:let 和const 接下来就说一下var let 和const的区别: 首先说var 用 ...

  4. C++ 笔记(15)— 引用(声明引用、引用作为参数、引用作为函数返回值、const 用于引用)

    引用是变量的别名.也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量. 1. 创建引用 要声明引用,可使用引用运算符 & ,如下面的 ...

  5. C++ 笔记(07)— 常量(字面常量、const定义常量、constexpr 定义常量、enum 定义常量、define 定义常量)

    在 C++ 中,常量类似于变量,只是不能修改.与变量一样,常量也占用内存空间,并使用名称标识为其预留的空间的地址,但不能覆盖该空间的内容. 常量可以是任何的基本数据类型,可分为整型数字.浮点数字.字符 ...

  6. Const 重载解析

    1. Const重载应用场景 首先,对于函数值传递的情况,因为参数传递是通过复制实参创建一个临时变量传递进函数的,函数内只能改变临时变量,但无法改变实参.则这个时候无论加不加const对实参不会产生任 ...

  7. 【C++自我精讲】基础系列二 const

    [C++自我精讲]基础系列二 const 0 前言 分三部分:const用法.const和#define比较.const作用. 1 const用法 const常量:const可以用来定义常量,不可改变 ...

  8. C++const关键字作用

    修饰普通变量,表示不可修改(在定义的时候必须初始化) #include <iostream> using namespace std; const int a1 = 10; int mai ...

  9. const与define相比优点_const与#define的区别、优点

    const与#define的区别 编译器处理方式不同 define宏是在预处理阶段展开. 补充:预处理器根据以#开头的命令,修改原始的程序.比如我们常见的#include 命令告诉处理器读取系统头文件 ...

  10. inline函数返回值_C++知识补充-指针,const,函数指针,指针数组,运算符重载

    嵌入式Linux:C++ 面试准备珍藏版本​zhuanlan.zhihu.com 明月照我心:123道c++笔试题汇总(含答案)​zhuanlan.zhihu.com 阿贵:常见C++笔试面试题整理​ ...

最新文章

  1. 【SSRS】入门篇(二) -- 建立数据源
  2. 面试官:Java中 serialVersionUID 的作用是什么?举个例子说明
  3. vscode使用markdown语言编写文本
  4. setxor--求两个集合交集的非(异或)
  5. Cannot resolve the collation conflict between SQL_Latin1_General_CP1_CI_AS and Latin1_General_100...
  6. 个人电脑 公司电脑 代理_你们想要打造的树莓派电脑,刚发布了官方版:性能更强大,只卖70美元...
  7. Linux中Docker常用命令
  8. c语言自由存储区,C/C++ 内存分区以及自由存储区和堆的区别
  9. AHOI2018训练日程(3.10~4.12)
  10. 淘宝与拍拍的世纪之战!(庄帅)
  11. 办公室计算机如何互传文件,办公室电脑互联,打印机共享,方便快速的网内文件传输...
  12. 计算机二级excel服装采购表,计算机二级excel真题:制作采购成本分析表
  13. 计算机科学与技术以为舟,于哲舟-吉林大学计算机科学与技术学院
  14. android 关闭jack_Android7.0编译 jack常见错误类型及解决办法
  15. 利用LDA和主题模型发现9种冠状病毒研究趋势
  16. 转载:详解5个被误解的CPU/GPU概念
  17. 服务器性能计数器驱动没装上,安装和删除 AD DS 的已知问题
  18. 微信小程序订单扫码结算的步骤
  19. 记录几个ubuntu无法开机的问题
  20. ER模型、ER分析介绍

热门文章

  1. Rails Rake 指南
  2. 机房预订系统(水文)
  3. Linux命令ip addr详解
  4. Linux中soft nproc 、soft nofile和hard nproc以及hard nofile配置
  5. 华为荣耀linux系统,中国国产操作系统来了,华为荣耀笔记本首度搭载
  6. vagrant 常用 命令
  7. IDEA在terminal使用mvn命令
  8. Kotlin类成员初始化顺序
  9. Eclipse安装记录
  10. 云计算中SOA是什么?