ES2015 const 与不变性无关
这似乎是一个非常普遍的误解。 我经常在博客文章遇到它。 这是我试图把事情弄清楚的尝试。
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()
仅适用于属性值对。 目前没有办法使其他对象(例如 Dates、Maps 或 Sets)完全不可变。
有人提议在未来版本的 ECMAScript 中添加不可变数据结构。
const 与 let
const
和 let
之间的唯一区别是 const
使其不会发生重新绑定。
到目前为止,我在这里写的一切都是事实。 以下内容完全是主观的,但请耐心等待。
综上所述,const
使代码更易于阅读:在其范围内,const
变量始终引用同一个对象。 let
没有这样的保证。 因此,在你的 ES2015 代码中使用 let
和 const
是有意义的:
-
默认使用
const
-
只有在需要重新绑定时才使用
let
-
(在 ES2015 中不应该使用
var
)
你同意? 为什么不)? 我特别感兴趣的是,开发人员更喜欢 let
而不是 const
(即,即使是永远不会反弹的变量)。 如果你在没有重新绑定的情况下使用 let
,那么你为什么首先使用 let
? 是因为“const is for constants”的误解,还是另有原因?
相关文章
C++ 中的 const 成员函数
发布时间:2023/03/31 浏览次数:107 分类:C++
-
本文是关于 C++ 中常量成员函数的使用。我们使用关键字 const 使任何对象、变量或函数成为常量。
C++ 中 Const Int 和 Int Const 之间的区别
发布时间:2023/03/15 浏览次数:200 分类:C++
-
在本文中,我们将了解 const int 与 int const 的不同之处。我们将根据简单的变量和指针来讨论这个问题。我们还将讨论 C++ 的常量关键字的基础知识以及各种工作示例。
解决 TypeScript 中 Not all constituents of type 'X | Y' are callable 错误
发布时间:2023/01/30 浏览次数:225 分类:TypeScript
-
This expression is not callable. Not all constituents of type X | Y are callable 的错误出现在一个值可能是多种类型时,其中一些类型不是函数。要解决该错误,请使用类型保护来使 在调用它之前确保该
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 运算符的情况下使用它,例如