在JavaScript中,为什么不能修改常量字符串而可以修改常量数组

在JavaScript中,为什么不能修改常量字符串而可以修改常量数组,javascript,arrays,constants,Javascript,Arrays,Constants,执行此JavaScript时,我收到一个错误: const name = 1; name = 2; 为什么我们能够修改一个数组,即使它被声明为常量。因为数组本身没有改变,它仍然是同一个数组。在类似C语言的语言中,类似于这一点的是一个常量指针(指向内存中的某个地址)——您不能更改指针指向的位置,但内存仍然是可写的 在JavaScript中,这种类似指针的行为适用于非原语的任何东西(即数字,布尔,字符串…),基本上是数组和对象。如果您想知道为什么字符串是原语,那是因为。ES2015const并不表

执行此JavaScript时,我收到一个错误:

const name = 1;
name = 2;

为什么我们能够修改一个数组,即使它被声明为常量。

因为数组本身没有改变,它仍然是同一个数组。在类似C语言的语言中,类似于这一点的是一个常量指针(指向内存中的某个地址)——您不能更改指针指向的位置,但内存仍然是可写的


在JavaScript中,这种类似指针的行为适用于非原语的任何东西(即
数字
布尔
字符串
…),基本上是数组和对象。如果您想知道为什么字符串是原语,那是因为。

ES2015
const
并不表示值是
常量
不可变
const
值肯定可以更改。以下是完全有效的ES2015代码,不会引发异常:

constobj={};
obj.bar=42;
控制台日志(对象条);

// → 42
因为
常量
不幸的是并不意味着“不可变”。这是因为常量不能被重新分配。更改数组时,不会重新分配变量。如果不希望
arr
是可变的,可以使用
Object.freeze(arr)
TypeError: Assignment to constant variable.
    at Object.<anonymous> (/home/user01/JavaScript/scope.js:2:6)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)
    at startup (bootstrap_node.js:191:16)
    at bootstrap_node.js:612:3
const arr = [1,2,3];
arr[1] = 5;