JS导入是不可变的还是不可写的?

时间:2017-03-29 13:45:42

标签: javascript ecmascript-6 es6-modules

据我所知,导入绑定是不可变的

import { foo } from './foo';
...
foo.bar = 23; // works 
...
foo = { bar: 23 }; // syntax error

但是,我已经读过elsewhere JS导入实际上是不可写的(不是不可变的)......在这种情况下,第一个赋值语句也不会foo.bar = 23;抛出语法错误?

更新(我现在如何理解)

......用@FelixKing的优秀答案来解释......

JS导入是对导出的东西(变量,函数等)的不可变绑定。

对于非原始导入,这并不意味着导入对象上的属性必须是不可变的或不可写的。

1 个答案:

答案 0 :(得分:8)

  

在这种情况下不会是第一个赋值语句,foo.bar = 23;还会抛出语法错误?

不可写是指变量的值,其中可变(不可变)描述值本身是否可以到位

您发现进口不可写。但是如果导入的值是可变的,那么您可以更新该值(就地)。

foo.bar = 23;

不会为foo分配新值。 读取 foo的值,然后修改它(通过添加或覆盖属性)。如果你做了

var oldFoo = foo;
foo.bar = 23;
oldFoo === foo; // true

你会得到true。这表明foo仍然分配了相同的值。它只更新了值(对象)。

所有对象都是可变的(除非传递给Object.freeze或类似函数),而原始值(String,Number等)都是不可变的。