首页 > 其他分享 >JS中const对于复杂类型变量和普通类型变量的区别详解

JS中const对于复杂类型变量和普通类型变量的区别详解

时间:2024-10-28 10:43:53浏览次数:5  
标签:存储 const 变量 更改 JS 关键字 类型

转自于:https://www.jb51.net/javascript/303802q78.htm

const关键字是让什么不能变?

const实际上的不能变并不是说变量的值不能变,而是初始化后变量所指向在栈中的内存上的数据不能变

我们先切记这一点先,看下文!!!

js中变量的两种类型

js中的变量类型可以分为两种:

  • 简单数据类型

    Number

    String

    Boolean

    Undefined

    null

    symbol

  • 复杂数据类型(下面我都称为对象)

    Object

    Array

    Function(函数实际上是对象)

两种类型的的存储区别

都是两种数据结构,靠他们来给变量分配使用内存

js的两种数据类型的变量即是存储在堆和栈中

简单类型变量的存储

这种类型的变量我们是用得最多的

它是存储在栈中而已

以下是的示例定义

1 2 3 var num=100 var bool=false var str='字符串

而他在栈中的存储可以形象比喻为这样子

 

 

其中变量的值存储在变量指向的栈中的内存地址上,看上图,100就是存储在内存地址上

结合上面所说的const的作用就知道为什么const关键字定义的简单类型的变量的值不能变,因为改变其变量的值是直接改变变量指向的内存上的数据,这是const关键字不允许的

那为什么复杂类型的又可以呢,看下文

复杂类型变量的存储

先说一下,复杂类型的值的更改指的是

复杂类型变量里属性可以更改,整个对象的更改const关键字是不允许的!!!

比如

1 2 3 4 5 6 7 8 9 const ob={ a:100, b:200 } const ob1={ c:100 } ob.a=200         //   successful ! ! ! ob=ob1           //   fail ! ! !

如果需要替换整个对象,const关键字是不允许的,但是属性值的更改是可以的

那这又是为什么 ? 看下面

我们先要记住const关键字是不允许更改变量的哪个地方,是变量在栈中存储变量值的内存地址上的值

对,没错 !!!这也是普通变量值不能更改的原因

但是为什么复杂变量的可以更改呢,但是不可以替换呢

主要原因是:

复杂变量的值不是存储在栈中,而是存储在堆里,复杂变量在栈中内存上的值是指向存储该复杂类型变量值的堆上的地址

如果这句话看不懂的话,可以看下图

 

 

 

所以更改对象的属性值是更改在堆上的值,而替换对象则是要更改存储在栈中内存地址上变量在堆上存储数据的地址值,而这个更改恰恰是const关键字不允许的!!!

这也是为什么会有对象的浅拷贝和深拷贝的原因,因为你把一个对象直接赋值给另一个对象,准确来说是把对象变量在栈中的存储的指向改变了,指向了同一个在堆里存储的数据,所以你改变其中一个变量的值,会造成其堆上存储的数据改变,所以另外一个对象的值也会改变,这就是为啥会有浅拷贝!!!

标签:存储,const,变量,更改,JS,关键字,类型
From: https://www.cnblogs.com/Ao-min/p/18509894

相关文章

  • XLSX.js 读取 excel空的时候不显示
    在使用XLSX.js读取Excel文件时,如果某个单元格为空,默认情况下XLSX.js不会在JSON结果中包含这个空单元格。如果你希望在JSON结果中看到空单元格,你可以在读取Excel文件时,使用配置项 {defval:""},这样空单元格会被视为一个值为空字符串的单元格。以下是一个使用XLSX.......
  • js练习:Click and Drag
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>ClickandDrag</title><linkrel="stylesheet"href="style.css"><linkrel="icon"h......
  • 在Postman中使用Pre-request Script简单使用例子(二)——全局环境变量使用
    本文主要介绍在Postman中Pre-requestScript怎么使用全局环境变量快速进行api接口测试的方法。需求背景:客户端调用服务端不同接口,但是接口的使用规则都是一样的,就是使用常见的ak+sk方式进行生成签名放到header当中,服务端获取签名根据约定规则进行验证签名合法性。如果是开......
  • 基于ssm+jsp的电影推荐系统(含源码+数据库)
    1.开发环境开发系统:Windows10/11架构模式:MVC/前后端分离JDK版本:JavaJDK1.8开发工具:IDEA数据库版本:mysql5.7或8.0数据库可视化工具:navicat服务器:apachetomcat主要技术:Java,Spring,SpringMvc,mybatis,mysql,vue2.视频演示地址3.功能该系统包含管理......
  • jenkins内置提供的全局变量
    jenkins内置提供的全局变量列出环境变量让我们首先列出所有可用的环境变量。您可以通过两种不同的方法进行操作。您可以${YOUR_JENKINS_HOST}/env-vars.html在Jenkins主服务器上打开页面,以获取HTML页面上列出的所有环境变量的列表方法2:pipeline{        agentan......
  • 数据类型与变量
    1.字面常量  常量即程序运行期间,固定不变的量称为常量publicclassTest{ publicstaticvoidmain(String[]args){    System.Out.println("helloworld!");   // 字符串常量:由""括起来的   System.Out.println(100);      ......
  • __init__? self.value = value? constructor? instance object?
    为什么会出现self.value=value的实例变量呢?为什么要给类设置出一个构造函数呢.下面具体谈一下实例化对象的一些特点和用途:封装性和复用性:实例化对象可以将数据和行为封装在一起,从而提高代码的可维护性和复用性。例如,在上面的例子中,Person类定义了一个通用的人的属性和行为,我......
  • 线程同步(互斥锁条件变量)
     线程同步互斥锁(互斥量)条件变量生产/消费者模型一、互斥锁C++11提供了四种互斥锁:mutex:互斥锁。timed_mutex:带超时机制的互斥锁。recursive_mutex:递归互斥锁。recursive_timed_mutex:带超时机制的递归互斥锁。包含头文件:#include<mutex>1、mutex类1)加锁lock()互斥锁......
  • Chromium base库 环境变量类使用说明c++
    1、环境变量获取和设置定义参考:base\environment.hbase\environment.cc//Copyright2011TheChromiumAuthors//UseofthissourcecodeisgovernedbyaBSD-stylelicensethatcanbe//foundintheLICENSEfile.#ifndefBASE_ENVIRONMENT_H_#defineBASE_EN......
  • js逆向,自动吐环境代码
    functionget_enviroment(proxy_array){for(vari=0;i<proxy_array.length;i++){handler='{\n'+'get:function(target,property,receiver){\n'+'console.log("方法:","get","对象:"......