如何const定义一个不可变数组

2023-11-15

有个常见的面试题,我们知道,const是es6中新增用于定义常量。但是对于引用类型来说,const 所说的常量,是指,对应的指针或者说地址是常量。那么,如果我们要求,我们定义的数组里面的元素也是不可改变的呢?先来看现象

const a = [1, 2, 3];
console.log(a);
a[0] = 4;
console.log(a)
复制代码

输出是

[1, 2, 3]
[4, 2, 3]
复制代码

可以简单,用const定义的数组,里面的元素是可变的

那么,考虑到,数组其实也是继承于对象,那么,根据下面三个规则

  1. Object.preventExtendsion(obj) 用来禁止对象可扩展其它属性
  2. Object.seal(obj)用来禁止对象删除其它属性和扩展其它属性
  3. Object.freeze(obj)用来冻结对象,就是所有的属性不能够更改和新增

关于Object.preventExtendsion

来看第一种方案

const a = [1, 2, 3, {second: 11}];
console.log(a);
console.log(Object.getOwnPropertyDescriptor(a, 0));
Object.preventExtensions(a); // 开始锁定对象
a[4] = 4;
console.log(a)
console.log(Object.getOwnPropertyDescriptor(a, '1'));
console.log(Object.isExtensible(a));
delete a[0];
console.log(a);
复制代码

输出如下:

[1, 2, 3, [object Object] {
  second: 11
}]
[object Object] {
  configurable: true,
  enumerable: true,
  value: 1,
  writable: true
}
[1, 2, 3, [object Object] {
  second: 11
}]
[object Object] {
  configurable: true,
  enumerable: true,
  value: 2,
  writable: true
}
false
[undefined, 2, 3, [object Object] {
  second: 11
}]
复制代码

由此可见,preventExtensions可以阻止对象新增属性。但是原对象依旧可以改删其它原有属性,

关于object.seal

const a = [1, 2, 3, {second: 11}];
console.log(a);
console.log(Object.getOwnPropertyDescriptor(a, 0));
Object.seal(a);
a[4] = 4;
console.log(a);
console.log(Object.getOwnPropertyDescriptor(a, '1'));
console.log(Object.isExtensible(a));
delete a[0];
console.log(a);
a[0] = 5;
console.log(a);
复制代码

输出如下:

[1, 2, 3, [object Object] {
  second: 11
}]
[object Object] {
  configurable: true,
  enumerable: true,
  value: 1,
  writable: true
}
[1, 2, 3, [object Object] {
  second: 11
}]
[object Object] {
  configurable: false,
  enumerable: true,
  value: 2,
  writable: true
}
false
[1, 2, 3, [object Object] {
  second: 11
}]
[1, 2, 3, [object Object] {
  second: 11
}]
复制代码

可以看到,configurable已经变成了false,说明是不可以删除的,后面的delete操作也是无效。但是,对象里面的值却是可以更改的

关于Object.freeze

所以,有了以下方案:

const a = [1, 2, 3];
console.log(a);
Object.freeze(a);
a[0] = 4;
console.log(a)
复制代码

输出如下

[1, 2, 3]
[1, 2, 3]
复制代码

由此可见,对象里面的元素也是不可变的

再来试验,如果对应的value不是个简单数据类型呢,比如如下

const a = [1, 2, 3, {second: 11}];
console.log(a);
console.log(Object.getOwnPropertyDescriptor(a, 0));
Object.freeze(a);
a[4] = 4;
console.log(a);
console.log(Object.getOwnPropertyDescriptor(a, '1'));
console.log(Object.isExtensible(a));
delete a[0];
console.log(a);
复制代码

输出如下


[1, 2, 3, [object Object] {
  second: 11
}]
[object Object] {
  configurable: true,
  enumerable: true,
  value: 1,
  writable: true
}
[1, 2, 3, [object Object] {
  second: 11
}]
[object Object] {
  configurable: false,
  enumerable: true,
  value: 2,
  writable: false
}
false
[1, 2, 3, [object Object] {
  second: 11
}]
复制代码

证明,还是不可变的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何const定义一个不可变数组 的相关文章

随机推荐

  • 最大子数组之和对应的子数组

    给定一个整数数组 包含正负数 找到一个具有最大和的子数组 返回其最大的子数组 public static List
  • [译]理解HTTP/304响应

    原文 http www telerik com automated testing tools blog eric lawrence 12 11 06 understanding http 304 responses aspx 刚刚开始使用
  • 【JetBrains】安装使用技巧

    JetBrains 使用 JetBrains Toolbox 管理 IDE 远程开发 Gateway 通过 SSH 连接 疑难杂症 1 部署失败 使用 JetBrains Toolbox 管理 IDE 下载 Toolbox 工具 解压运行
  • Wireshark常用命令

    目录 页面 命令 不定期更新我自己遇到的语法 页面 命令 数据链路层 筛选mac地址为04 f9 38 ad 13 26的数据包 eth src 04 f9 38 ad 13 26 筛选源mac地址为04 f9 38 ad 13 26的数据
  • 模板特化

    上一篇 模板与重载 里 我遇见了想同时使用模板函数与非模板函数的情况 后来才知道 其实并不需要 当我想对某些特定的类型进行特殊操作时 只需要使用模板特化就可以 所谓特化 就是说对于模板函数 对于某些类型可能需要特殊处理 所以进行特殊化 可以
  • OpenApi-Generator:简化RESTful API开发流程

    目录 1 OpenAPI Generator简介 1 1 OpenAPI Generator是什么 1 2 为什么选择OpenAPI Generator 1 3 谁需要 OpenAPI Generator 2 OpenAPI 2 0规范 2
  • 单臂路由实现原理

    一 概述 单臂路由 router on a stick 是指在路由器的一个接口上通过配置子接口 或 逻辑接口 并不存在真正物理接口 的方式 实现原来相互隔离的不同VLAN 虚拟局域网 之间的互联互通 单臂路由的子接口 路由器的物理接口可以被
  • Python Pandas 处理空数据/缺失数据 dropna fillna,增加/更新列 assign,分层 qcut,向量函数

    Pandas 处理空数据 缺失数据 增加 更新列 分层 向量函数 数据准备 一 处理缺失数据 1 1 去除有缺失数据的行 dropna 1 2 替换缺失数据 fillna 二 增加 更新列 2 1 指定生成列的方式 2 2 复制现有的列生成
  • dataframe的索引遍历_pandas

    今天是pandas数据处理专题第三篇文章 我们来聊聊DataFrame中的索引 上篇文章当中我们简单介绍了一下DataFrame这个数据结构的一些常见的用法 从整体上大概了解了一下这个数据结构 今天这一篇我们将会深入其中索引相关的应用方法
  • 开发一个APP需要多少钱?

    作为一个移动端开发人员 我们可能被外行朋友或者被客户问及最多的一个问题就是 开发一个APP需要多少钱 不错 这个是大家特别关心的问题 也是互联网公司非常重视的一个问题 因为涉及到自己的成本问题 作为APP开发人员 站在产品经理的角度来给大家
  • windows 2008 32位IIS 服务器转到64位后的各种错误,以及解决方法

    之前在32位IIS服务器上没有问题 发布到64位出现各种错误 请检查以下几项 因各系统不一样 有则检查 无则跳过 重点第4点 1 先安装IIS 后安装 net 4 0环境 否则要重新注册iis windir Microsoft NET Fr
  • 机器学习可视化:模型评估和参数调优

    本篇文章详细阐述机器学习模型评估和参数调优 将主要围绕两个问题来阐述 知其所以然 当你选择的一个机器学习模型运行时 你要知道它是如何工作的 青出于蓝 更进一步 你得知道如何让此机器学习模型工作的更优 模型评估的方法 一般情况来说 F1评分或
  • 第四届蓝桥杯省赛JavaB组第六题三部排序

    标题 三部排序 一般的排序有许多经典算法 如快速排序 希尔排序等 但实际应用时 经常会或多或少有一些特殊的要求 我们没必要套用那些经典算法 可以根据实际情况建立更好的解法 比如 对一个整型数组中的数字进行分类排序 使得负数都靠左端 正数都靠
  • 在阿里云上运行hadoop遇到的50070,9000无法访问问题

    问题 我在阿里云上运行namenode和腾讯云上运行datanode 在hadooop配置完之后 运行hdfs 发现没有namenode 然后查看namenode的日志 日志显示50070端口被占用 9000端口拒绝服务 但是通过natst
  • vue - 实现页面全屏文字水印效果,类似 word 插入的自定义水印(支持单页或整个项目全部页面 “选择性“ 插入,可自定义水印文字、大小样式等,也能动态设置文字)和页面一同渲染,无任何卡顿示例源码

    效果图 代码干净简洁 示例源码注释详细 无任何乱七八糟的代码 本文实现了 单页或整个项目所有页面的全屏水印效果 支持自定义水印文字 可 动态 设置文字内容 你只需要复制本文提供的封装方法 直接在页面中或 App vue 中引入即可生效 只需
  • vue3+element-plus实现表格多选功能(可以清除选项或分页保留选项)

    如图所示 在实际开发中 数据量大的表格基本都添加上了分页功能 每个页面请求的数据回交换更新 第一页的选中效果在跳转至第二页后 如果没有做相关处理 选中项会被清空 具体解决方法如下 在需要处理的表格标签中加上 row key getRowKe
  • 第五章-CSRF漏洞

    第五章 CSRF漏洞 第一节 CSRF原理介绍 1 1 CSRF漏洞定义 CSRF Cross site request forery 跨站请求伪造 也被称为One Click Attack或者Session Riding 通常缩写为CSR
  • k8s组件理解

    一 k8s组件交互关系由下图可大致体现 二 k8s master组件理解 1 kube apiserver组件 kube apiserver Kubernetes kubernets API server 提供了k8s各类资源对象的增删改查
  • EasyTalking微博系统

    EasyTalking微博系统 摘要 随着互联网的迅猛发展 人们的日常生活 学习工作已经离不开网络 人们的生活和工作在未来的生活中将越来越依赖于计算机网络技术的发展 越来越网络化 电子化 虚拟化 便捷化 Internet目前的应用历程和发展
  • 如何const定义一个不可变数组

    有个常见的面试题 我们知道 const是es6中新增用于定义常量 但是对于引用类型来说 const 所说的常量 是指 对应的指针或者说地址是常量 那么 如果我们要求 我们定义的数组里面的元素也是不可改变的呢 先来看现象 const a 1