Kev*_*ith 7 javascript immutability
const
JavaScript中的关键字是否创建了对不可变数据结构的不可变引用?[我假设JavaScript中存在不可变数据结构.]
因为string
它似乎这样做:
var x = "asdf";
const constantX = x;
alert("before mutation: " + constantX);
x = "mutated"
alert("after mutation: " + constantX);
Run Code Online (Sandbox Code Playgroud)
输出:
突变之前:asdf
突变后:asdf
Dus*_*etz 16
首先,你没有改变字符串,你正在重新分配引用.
你是对的,const
并非在所有常见的浏览器中都可用.但即使是这样,也是不够的.const
将阻止引用被重新分配 - 但如果你有一个const引用可变对象,你还没有完成.
const var o = { foo: 'bar' };
o = { foo: 'baz'}; // throws
o.foo = 'baz'; // allowed
Run Code Online (Sandbox Code Playgroud)
这就是我们提出你的问题,js甚至有不可变的数据结构吗?不,js不随身携带.不可变数据结构可以编码为库 - 甚至没有定义赋值,因此o.foo = 'baz'
甚至没有意义.你必须写它const var o2 = o.assoc('foo', 'baz')
,它将返回一个全新的对象o2
而不是变异o
但是,如果没有人使用它们,那么作为库的不可变数据结构并不意味着什么.例如,如果angular使用常规的javascript数据结构,你也必须使用它们.否则,您必须在代码和角度之间的边界处在可变和不可变之间进行转换.
意见如下:
IMO是您为生产浏览器应用程序进行实际功能编程的唯一实用选项,就是等待ClojureScript等成熟的东西.ClojureScript重新启动了库生态系统,因此在编写库时,它们默认使用不可变数据结构.
您当然可以使用诸如underscore.js和Facebook React之类的工具在javascript中进行半生不熟的函数式编程,这就是我为我构建的生产webapp所做的.但是你必须按惯例建立不变性,人们会在事故中改变事物,或者因为他们不知道更好,你必须应对这些挑战.
错误.从MDN来看,这不是一成不变的:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
const声明创建对值的只读引用.它并不意味着它拥有的值是不可变的,只是不能重新赋值变量标识符.
是的,它确实创建了一个不可变引用,但它没有标准化,并且在所有浏览器中都不受支持.
有关详细信息和兼容性,请参阅此关键字的MDN文章const
.
但是,它不会将引用的数据结构设置为不可变.以下几个答案使用,例如,Object.freeze
唯一不可变的数据结构(在堆上分配的东西)是字符串.默认情况下,对象,数组和函数等所有其他对象都是可变的.
在const
创建不可改变的变量.是的,"const变量"听起来有争议,但这是我能为JS提出的最接近的术语.
const内容不能在声明之外更改.但它可能包含引用,例如,它本身是可变的对象.因此,您可以通过该const引用来修改其属性.
如果你想让对象变成不可变的,那么就有一个Object.freeze(obj)方法.
您可以使用 ES5 Object.defineProperty创建类似 CONST 的值。糟糕的部分是它必须绑定到一个对象
CONSTS = {};
Object.defineProperty(CONSTS, 'FOO', {
value: 'bar'
});
CONSTS.FOO = 'derp' // Will throw error in strict mode
delete CONSTS.FOO // will throw error in strict mode
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7688 次 |
最近记录: |