理解es6中的const与“不变”

const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。

效果

  • 对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量
  • 对于复合类型的数据(主要是对象和数组),变量指向的内存地址,const只能保证这个指针是固定的,不能保证它指向的数据结构是不可变得
'use strict'
const obj = {}
const arr = []
obj.prop = 123  // 不改动指针
arr.push('Hello')  // 只改变数据结构

try{
    obj = {} // obj重指向新对象
} catch (err) {
    console.log(err.message) // 失败
}

try{
    arr = []
} catch (err) {
    console.log(err.message) // 失败
}

彻底冻结

除了将对象本身冻结,对象的属性也应该冻结

关于Object.freeze

方法可以冻结一个对象。冻结对象是指那些不能添加新的属性,不能修改已有属性的值,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性的对象。

'use strict'
const foo = {}
foo.prop = 1
foo.config = {
    prop:1
}

const freeze = obj => {
    Object.freeze(obj)
    Object.keys(obj).forEach( key=>{
        if(typeof obj[key] === 'object') {
            freeze(obj[key])
        }
    })
}

freeze(foo) // 完全冻结
try {
    foo.prop = 'test'
} catch (err) {
    console.log(err.message)
}

欢迎技术交流,引用请注明出处。

个人网站:哥有内涵.com

Github:godbmw

原文地址:https://www.cnblogs.com/geyouneihan/p/9127308.html

时间: 2024-10-07 12:57:32

理解es6中的const与“不变”的相关文章

es6中let,const区别与其用法

ECMAScript 是什么? 首先,我们都知道JavaScript由三部分组成:ECMAScript,DOM,BOM: 其中的ECMAScript是Javascript的语法规范. ECMAScript定义了很多东西,如: 语法-----解析规则,关键字,语句,声明,操作等 类型-----布尔型,数字,字符串,对象等 原型和继承 内置对象,函数的标准库----------JSON, Math, 数组方法,对象方法等 浏览器兼容: 目前Google和Firefox浏览器对ES6新特性的兼容最友好

理解ES6中的Symbol

一.为什么ES6引入Symbol 有时候我们在项目开发的过程中可能会遇到这样的问题,我写了一个对象,而另外的同时则在这个对象里面添加了一个属性或是方法,倘若添加的这个属性或是方法是原本的对象中本来就有的,那么这个时候势必会造成冲突,那么为了防止这种冲突,ES6 就引入了Symbol 二.Symbol使用方法 Symbol是一个新的数据类型,所以不要因为Symbol的使用方法的特殊而认为它只是es6中的新的方法.它所代表的是独一无二的,即便其参数一致. 1.使用方法 Symbol的使用方法是Sym

理解ES6中的Iterator

一.为什么使用Iterator 我们知道,在ES6中新增了很多的特性,包括Map,Set等新的数据结构,算上数组和对象已经有四种数据集合了,就像数组可以使用forEach,对象可以使用for...in.. 进行遍历一样,是不是随着Map和Set的出现也应该给这两种集合一个遍历方法呢?如果这样的话js的方法对象就太多了,既然这四种集合都是需要遍历的,那么完全可以用一个统一的访问机制.于是乎Iterator应运而生. 二.Iterator是什么 Iterator是一个访问机制,同时是一个接口,可以实

深入理解C++中的Const,Mutable以及Volatile

我一直认为const表示一个常量,常量就是一个无法被修改的值,但是没有深入理解const的实现,甚至不知道mutable和volatile的存在,最近在书中看到了这一部分的知识,所以本文将详细解析这几个关键词. 首先考虑以下几个问题: 1. const int a和int const a的区别. 2. const char* s和char *const s的区别. 3. 下列代码有问题吗?如果有问题应该如何修改? class A { private: int a; const int fun()

ES6中的const命令【转】

1.const声明一个只读常量,一旦声明,常量的值就不能改变 1 const PI=3.1415; 2 console.log(PI);//3.1415 3 4 PI=3;//Uncaught TypeError: Assignment to constant variable. 2.const一旦声明常量,就必须立即初始化,不能留到以后赋值 1 const WIDTH;//Uncaught SyntaxError: Missing initializer in const declaratio

ES6中的const命令

1.const声明一个只读常量,一旦声明,常量的值就不能改变 1 const PI=3.1415; 2 console.log(PI);//3.1415 3 4 PI=3;//Uncaught TypeError: Assignment to constant variable. 2.const一旦声明常量,就必须立即初始化,不能留到以后赋值 1 const WIDTH;//Uncaught SyntaxError: Missing initializer in const declaratio

ES6基础之const声明

问题 今天在分析React教程时,观察到如下代码: class Board extends React.Component { constructor(props) { super(props); this.state = { squares: Array(9).fill(null), }; } handleClick(i) { const squares = this.state.squares.slice(); squares[i] = 'X'; this.setState({squares

关于var和ES6中的let,const的理解

var的作用就不多说了,下面说说var的缺点: 1.var可以重复声明 var a = 1; var a = 5; console.log(a); //5 不会报错 在像这些这些严谨的语言来说,一般是不允许重复声明的. 2.无法限制修改 var a = 5; a = 6; console.log(a); //6 不会报错 3.没有块级作用域 if(true){ var a = 5; } console.log(a) // 5 以上几个就是我个人对var的看法 ES6中,多了两个声明let 和 c

ES6之let(理解闭包)和const命令

ES6之let(理解闭包)和const命令 最近做项目的过程中,使用到了ES6,因为之前很少接触,所以使用起来还不够熟悉.因此购买了阮一峰老师的ES6标准入门,在此感谢阮一峰老师的著作. 我们知道,ECMAScript 6即ES6是ECMAScript的第五个版本,因为在2015年6月正式发布,所以又成为ECMAScript2015.ES6的主要目的是为了是JS用于编写复杂的大型应用程序,成为企业级的开发语言. 说明:由于有时候我们希望得知es6代码的具体实现原理或者说希望能够转化为es5使用,