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
或类似函数),而原始值(字符串、数字等)都是不可变的。
据我所知,导入绑定是不可变的
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
或类似函数),而原始值(字符串、数字等)都是不可变的。