Tri*_*Gao 32 javascript immutability
当有人需要Object.freeze在JavaScript中使用时,我不清楚.MDN和MSDN在有用时不提供真实的例子.我得到的部分是关于无法在运行时更改它,这是由崩溃强制执行的.问题是我什么时候才能体会到崩溃.
对我而言,不变性是一种设计时间约束,应该由类型检查器保证.
因此,在动态类型语言中发生运行时崩溃是否有任何意义,除了比以后更好地检测违规之外?
Gor*_*man 14
该Object.freeze功能执行以下操作:
这是什么部分,但为什么有人会这样做?
嗯,在面向对象的范例中,存在这样的概念:现有的API包含某些不打算在其当前上下文之外进行扩展,修改或重用的元素.final各种语言中的关键字是最合适的.即使在未编译且因此易于修改的语言中,它仍然存在,即PHP,在这种情况下,JavaScript.
Ply*_*ynx 10
当您拥有表示逻辑上不可变数据结构的对象时,可以使用此方法,尤其是在以下情况下:
作为API作者,这可能正是您想要的行为.例如,您可能有一个内部缓存的结构,该结构表示您通过引用提供给API用户的规范服务器响应,但仍然在内部用于各种目的.您的用户可以引用此结构,但更改它可能会导致您的API具有未定义的行为.在这种情况下,如果用户尝试修改异常,则需要抛出异常.
在我的nodejs服务器环境中,我使用freeze是出于与使用'use strict'相同的原因.如果我有一个我不想被扩展或修改的对象,我会冻结它.如果某些东西试图扩展或修改我的冻结对象,我想要我的应用程序抛出一个错误.
对我而言,这与一致,高质量,更安全的代码有关.
编辑:在我最近的项目中,我在政府实体之间发送/接收加密数据.有很多配置值.我正在使用冻结对象来获取这些值.修改这些值可能会产生严重的不良副作用.另外,正如我之前链接的那样,Chrome在冻结对象方面表现出了性能优势,我认为nodejs也是如此.
为简单起见,一个例子是:
var US_COIN_VALUE = {
QUARTER: 25,
DIME: 10,
NICKEL: 5,
PENNY: 1
};
return Object.freeze( US_COIN_VALUE );
Run Code Online (Sandbox Code Playgroud)
没有理由修改此示例中的值.并享受速度优化带来的好处.
小智 5
Object.freeze主要用于函数式编程(不可移植性)
不变性是函数式编程的中心概念,因为如果没有不变性,程序中的数据流就会丢失。状态历史记录已被放弃,奇怪的错误可能会渗入您的软件中。
在JavaScript中,重要的是不要将const与不可变性混淆。const创建一个变量名绑定,创建后不能重新分配。const不会创建不可变的对象。您不能更改绑定引用的对象,但是仍然可以更改对象的属性,这意味着用const创建的绑定是可变的,而不是不变的。不变的对象根本无法更改。通过深度冻结对象,可以使值真正不变。JavaScript有一种将对象冻结一级的方法。
const a = Object.freeze({
foo: 'Hello',
bar: 'world',
baz: '!'
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9493 次 |
| 最近记录: |