JavaScript const 关键字

标签 javascript immutability

JavaScript 中的 const 关键字是否创建对不可变数据结构的不可变引用? [我假设 JavaScript 中存在不可变数据结构。]

对于 string 它似乎是这样做的:

var x = "asdf";
const constantX = x;

alert("before mutation: " + constantX);
x = "mutated"
alert("after mutation: " + constantX);

输出:

before mutation: asdf

after mutation: asdf

http://jsfiddle.net/hVJ2a/

最佳答案

首先你不是在改变字符串,而是在重新分配引用。

你是对的,const 并不是在所有常见的浏览器中都可用。但即使是,也不够。 const 将阻止引用被重新分配 - 但如果您有一个指向可变对象的 const 引用,您就没有完成很多事情。

const var o = { foo: 'bar' };
o = { foo: 'baz'}; // throws
o.foo = 'baz'; // allowed

那么这让我们想到了您的问题,js 甚至有不可变的数据结构吗?不,js 不随它们一起提供。 Immutable datastructures can be coded as a library - 甚至没有定义赋值,所以 o.foo = 'baz' 甚至没有意义。你必须把它写成 const var o2 = o.assoc('foo', 'baz') 这将返回一个全新的对象 o2 而不是改变 o

但是,如果没有人使用,不可变数据结构作为一个库就没有多大意义。例如。如果 Angular 使用常规的 JavaScript 数据结构,你也必须使用它们。否则,您必须在代码和 Angular 之间的边界处在可变和不可变之间进行转换。

意见如下:

在我看来,为生产浏览器应用程序进行真正的函数式编程的唯一可行选择是等待 ClojureScript 之类的东西成熟。 ClojureScript 重新启动了库生态系统,因此在编写库时,它们默认使用不可变数据结构。

您当然可以使用 underscore.js 和 Facebook React 等工具在 javascript 中进行半生不熟的函数式编程。 ,这就是我为我构建的生产 webapps 所做的。但是你必须按照惯例建立不变性,人们会在意外或因为他们不知道更好的情况下改变事物,你必须应对这些挑战。

关于JavaScript const 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20014513/

相关文章:

javascript - 如何在jquery中动态设置属性?

javascript - 使用淡入淡出切换隐藏除选择选项之外的所有其他 div 类

javascript - 使用 M :N 续写创建/发布

java - 如何在 Java 中安全地使用不可变类中的集合?

c++ - 声明 C++ 不可变类的惯用方式

Java Arraylist 改变影响其他变量

javascript - 更改序列 jQuery 中的文本颜色

javascript - Angularjs 中的幻灯片无法按预期工作

Java 代码 - 为什么要在此处克隆变量?

java - Java 中的不可变数组