迹忆客 专注技术分享

当前位置:主页 > 学无止境 > WEB前端 >

ES2015 const 与不变性无关

作者:迹忆客 最近更新:2023/01/09 浏览次数:

这似乎是一个非常普遍的误解。 我经常在博客文章遇到它。 这是我试图把事情弄清楚的尝试。


const 创建一个不可变的绑定

ES2015 const 并不表示一个值是“常量”或不可变的。 const 值绝对可以改变。 以下是完全有效的 ES2015 代码,不会抛出异常:

const foo = {};
foo.bar = 42;
console.log(foo.bar);
// → 42

这里唯一不变的是绑定。 const 将值 ({}) 赋给变量名 (foo),并保证不会发生重新绑定。 在 const 变量上使用赋值运算符或一元或前缀 --++ 运算符会引发 TypeError 异常:

const foo = 27;
// Any of the following uncommented lines throws an exception.
// Assignment operators:
foo = 42;
foo *= 42;
foo /= 42;
foo %= 42;
foo += 42;
foo -= 42;
foo <<= 0b101010;
foo >>= 0b101010;
foo >>>= 0b101010;
foo &= 0b101010;
foo ^= 0b101010;
foo |= 0b101010;
// Unary `--` and `++`:
--foo;
++foo;
// Postfix `--` and `++`:
foo--;
foo++;

ES2015 const 与值的不变性无关。


那么,如何使值不可变呢?

原始值,即数字、字符串、布尔值、符号、null 或未定义,始终是不可变的。

var foo = 27;
foo.bar = 42;
console.log(foo.bar);
// → `undefined`

要使对象的值不可变,需要使用 Object.freeze()。 它自 ES5 以来就已经存在,并且如今已广泛使用。

const foo = Object.freeze({
    'bar': 27
});
foo.bar = 42; // throws a TypeError exception in strict mode;
              // silently fails in sloppy mode
console.log(foo.bar);
// → 27

请注意Object.freeze() 是浅层的:冻结对象(即嵌套对象)中的对象值仍然可以改变。 Object.freeze() 上的 MDN 条目提供了一个示例 deepFreeze() 实现,可用于使对象值完全不可变。

不过,Object.freeze() 仅适用于属性值对。 目前没有办法使其他对象(例如 DatesMapsSets)完全不可变。

有人提议在未来版本的 ECMAScript 中添加不可变数据结构。


const 与 let

constlet 之间的唯一区别是 const 使其不会发生重新绑定。

到目前为止,我在这里写的一切都是事实。 以下内容完全是主观的,但请耐心等待。

综上所述,const 使代码更易于阅读:在其范围内,const 变量始终引用同一个对象。 let 没有这样的保证。 因此,在你的 ES2015 代码中使用 letconst 是有意义的:

  • 默认使用 const
  • 只有在需要重新绑定时才使用 let
  • (在 ES2015 中不应该使用 var

你同意? 为什么不)? 我特别感兴趣的是,开发人员更喜欢 let 而不是 const(即,即使是永远不会反弹的变量)。 如果你在没有重新绑定的情况下使用 let,那么你为什么首先使用 let? 是因为“const is for constants”的误解,还是另有原因?

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

C++ 中的 const 成员函数

发布时间:2023/03/31 浏览次数:107 分类:C++

本文是关于 C++ 中常量成员函数的使用。我们使用关键字 const 使任何对象、变量或函数成为常量。

C++ 中 Const Int 和 Int Const 之间的区别

发布时间:2023/03/15 浏览次数:200 分类:C++

在本文中,我们将了解 const int 与 int const 的不同之处。我们将根据简单的变量和指针来讨论这个问题。我们还将讨论 C++ 的常量关键字的基础知识以及各种工作示例。

ES2015 中有效的 JavaScript 变量名

发布时间:2023/01/09 浏览次数:68 分类:学无止境

ES2015 更新了标识符的语法。 这会影响很多事情,但最重要的是,标识符可以用作变量名称,并且标识符名称是有效的不带引号的属性名称。 这篇文章描述了与旧 ES5 行为相比的可观察

ES2015 中支持 Unicode 的正则表达式

发布时间:2023/01/08 浏览次数:92 分类:WEB前端

ECMAScript 2015 为 正则表达式 引入了两个新标志: y 启用粘性匹配。 u 启用各种与 Unicode 相关的功能。 本文解释了 u 标志的作用。 如果之前阅读过 JavaScript 存在 Unicode 问题 ,它会有所帮

JS 中Missing initializer in const declaration错误

发布时间:2022/12/21 浏览次数:209 分类:WEB前端

Missing initializer in const declaration 错误发生在使用 const 声明变量时,但其值未在同一行上初始化。 要解决该错误,请在声明它的同一行上初始化该变量,例如 const num = 30; 。 下面是发上上

JavaScript 中 Promise.resolve is not a constructor 错误

发布时间:2022/12/02 浏览次数:213 分类:JavaScript

当我们尝试将 Promise.resolve() 方法与 new 运算符一起使用时,会出现Promise.resolve is not a constructor错误。 Promise.resolve() 方法不是构造函数,因此应该在没有 new 运算符的情况下使用它,例如

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便