当前位置: 首页 > article >正文

JavaScript中的可变(Mutable)和不可变(Immutable)

JavaScript中的可变(Mutable)和不可变(Immutable)

在JavaScript中,可变(Mutable)和不可变(Immutable)主要是指数据类型的特性。

【可变指即使没有创建一个全新的值,也可以更改它。在 JavaScript 中,对象和数组默认都是可变的,但是原始值是不可变的——一旦创建原始值,它就不能被更改,尽管持有它的变量可能会再次重新分配到其它值。https://developer.mozilla.org/zh-CN/docs/Glossary/Mutable

除了 Object 以外,所有类型都定义了表示在语言最低层面的不可变值。我们将这些值称为原始值。在JavaScript中,对象是唯一可变的值。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures

在 JavaScript 中,原始数据类型(primitive data type)原始数值(primitive value)是一种既非对象也无方法或属性的数据。】

在JavaScript中,数据类型是否可变主要取决于它是原始类型(Primitive)还是对象类型(Object)。在JavaScript中,大多数对象都是可变的,少许例外,内置对象Map和Set是可变的,但内置对象Math对象就是不可变的;正则表达式是对象类型,但它们的模式和标志在创建后是不可变的。

可变(Mutable):如果一个数据类型是可变的,那么它的值可以在创建后被改变。在JavaScript中,对象、数组和函数是可变的。例如:

let obj = { name: 'John' };
obj.name = 'Jane'; // 可以改变对象的属性值
console.log(obj); // 输出 {name: 'Jane'},对象已经被改变

let arr = [1, 2, 3];
arr[0] = 4; // 可以改变数组的第一个元素
console.log(arr); // 输出 [4, 2, 3],数组已经被改变

函数也是JavaScript中的可变类型。你可以在运行时添加、修改或删除函数的属性。下面是一个例子:
// 定义一个函数
function greet() {
    console.log("Hello, world!");
}
// 给函数添加一个属性
greet.language = "English";
// 输出为函数新添加的属性
console.log(greet.language);  // 输出 "English"

不可变(Immutable):如果一个数据类型是不可变的,那么它的值在创建后就不能被改变。在JavaScript中,原始数据类型(如字符串、数字、布尔值、null、undefined和Symbol)是不可变的。例如:

let str = 'Hello';

str[0] = 'W'; // 这不会改变str的值,str仍然是'Hello'

console.log(str); // 输出 'hello',原字符串并未改变

在这个例子中,尽管我们试图改变字符串的第一个字符,但是字符串的值并没有改变。这是因为在JavaScript中,字符串是不可变的。

在JavaScript中,大多数对象确实是可变的。这意味着我们可以更改对象的属性或者添加新的属性。比如,我们可以创建一个空的对象,然后给它添加属性:

let obj = {};

obj.name = "John";

然后我们还可以修改这个属性:

obj.name = "Jane";

但是,有一些对象是不可变的。比如,你提到的Math对象和正则表达式对象。Math对象是一个内置对象,提供了一些数学常数和函数。我们不能更改这个对象。正则表达式对象在创建后也是不可变的。

另外,虽然Map和Set是可变的,但是它们的键是不可变的。即我们可以添加或删除键值对,但是不能更改已经存在的键。


http://www.kler.cn/a/105391.html

相关文章:

  • nodejs+vue购物网站设计系统-计算机毕业设计
  • 代码随想录算法训练营第2天| 977有序数组的平方、209长度最小的子数组。
  • ROS自学笔记十五:URDF工具
  • ChatGPT 与 Python Echarts 完成热力图实例
  • pycharm远程连接Linux服务器
  • centos7系统下,实现1台服务器免密登录多台服务器功能
  • 系统架构设计师之使用McCabe方法可以计算程序流程图的环形复杂度
  • 【设计模式】第5节:创建型模式之“简单工厂、工厂方法和抽象工厂模式”
  • 搜维尔科技:Geomagic Touch X力反馈设备【开箱图真机测试】
  • 【postman】postman的使用与postman汉化
  • 嵌入式系统设计师考试笔记之操作系统基础复习笔记二
  • 爬虫批量下载科研论文(SciHub)
  • Postman笔记
  • 前端访问geoserver服务发生跨域的解决办法,以及利用html2canvas下载绘制的地图
  • 小知识(6) el-table表格选中行和回显行(vue3)
  • 【iOS安全】提取app对应的URLScheme
  • Apache ActiveMQ RCE漏洞复现(CNVD-2023-69477)
  • 信息科技如何做好风险管理
  • JavaWeb——IDEA操作:Project最终新建module
  • 在Eclipse中使用Junit