据我所知,导入绑定是不可变的
import { foo } from './foo';
...
foo.bar = 23; // works
...
foo = { bar: 23 }; // syntax error
但是,我已经读过elsewhere JS导入实际上是不可写的(不是不可变的)......在这种情况下,第一个赋值语句也不会foo.bar = 23;
抛出语法错误?
更新(我现在如何理解)
......用@FelixKing的优秀答案来解释......
JS导入是对导出的东西(变量,函数等)的不可变绑定。
对于非原始导入,这并不意味着导入对象上的属性必须是不可变的或不可写的。
答案 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等)都是不可变的。