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

Are JS imports immutable or non-writable?

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

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

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

更新(我现在的理解)

...转述@FelixKing 的出色答案...

JS 导入是对导出事物(变量、函数等)的不可变绑定。

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

in which case wouldn't the first assignment statement, foo.bar = 23; also throw a syntax error?

不可写指的是变量的值,而as可变(不可变)描述的是值本身是否可以就地改变

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

foo.bar = 23;

没有给foo赋新值。它是 读取 foo 的值,然后修改它(通过添加或覆盖 属性)。如果你这样做了

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

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

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