Javascript常量是可变的吗?

Javascript常量是可变的吗?,javascript,ecmascript-6,Javascript,Ecmascript 6,我试图从arMin中删除max value,从arMax中删除min value,但是arr(是常量!)也会改变!我不知道为什么。我正在使用Google Chrome版本65.0.3325.181。 “arr”只声明一次,它不应该与此无关。我不明白。尝试使用delete,但它会将数字变为“空”,但效果相同,并更改常量! 这是我的第一篇帖子,如果我做错了什么,请原谅我 const arr = [1, 2, 3, 4, 5]; let arMin = arr; let arMax = arr; le

我试图从arMin中删除max value,从arMax中删除min value,但是arr(是常量!)也会改变!我不知道为什么。我正在使用Google Chrome版本65.0.3325.181。 “arr”只声明一次,它不应该与此无关。我不明白。尝试使用delete,但它会将数字变为“空”,但效果相同,并更改常量! 这是我的第一篇帖子,如果我做错了什么,请原谅我

const arr = [1, 2, 3, 4, 5];
let arMin = arr;
let arMax = arr;
let min = arMin.indexOf(Math.min.apply(null, arMin));
let max = arMax.indexOf(Math.max.apply(null, arMax));

arMin.splice(max, 1);
arMax.splice(min, 1);

console.log(arMin); // [2,3,4]
console.log(arMax); // [2,3,4]
console.log(arr); // [2,3,4]

arr
的值是对数组的引用

你不能改变这一点。它将始终是对该数组的引用

但是数组是可变的,因此可以更改数组中的值<代码>常量不会阻止这一点


如果希望
arMin
arMax
是不同的数组,则需要制作数组的副本,而不仅仅是复制
arr
的值(它是对该数组的引用)。

const
使引用恒定,而不是值

不能使
arr
指向其他对象,但可以更改其值



注意:其他语言具有指定常量值的能力。JavaScript的情况并非如此。

要完成前面的回答,要精确复制数组而不是复制引用,您应该执行以下操作:

const arr = [1, 2, 3, 4, 5];
let arMin = [...arr]; // We use spread operator to create new array from original one.
let arMax = [...arr];
let min = arMin.indexOf(Math.min.apply(null, arMin));
let max = arMax.indexOf(Math.max.apply(null, arMax));

arMin.splice(max, 1);
arMax.splice(min, 1);

console.log(arMin); // [1, 2, 3, 4]
console.log(arMax); // [2, 3, 4, 5]
console.log(arr); // [1, 2, 3, 4, 5]
---编辑1---
我使用TypeScript synthax来说明类型


当设置数组常量时,不能更改引用

const arr = [1,2,3]
arr = [4,5,6] \\ Throws errors; You can not change const reference
arr[1] = 6; \\ Works fine. You are not changing the const reference. You are just mutating the array.
const x = 5; \\ Here constant  is the value
x = x + 1; \\ Error. You can not change the constant value;

作为一个常量,您不能重新分配它的值,在这种情况下,它包含对数组的引用

但数组本身并不是一成不变的

例如:

const arr = [0,1,2,3,4,5];

arr = 'foo' // You cannot do that

arr.push(6) // That works fine. result: [0,1,2,3,4,5,6]

我认为你的想法是不变的而不是可变的?你搜索过了吗?这是有很好的文档记录的。使用
arr.slice()
创建数组的副本,使用创建不可变数组。请参考哪个答案。“先前的答案”几乎没有任何意义。谢谢你的回答。所以const只保留变量的类型,而不保留值?对于数组或对象等复杂类型,是的。但对于基本类型,如string、integer、no。您不能重写此基本类型。但您可以更新数组或对象。我更新了我的答案来说明这一点。
const arr = [0,1,2,3,4,5];

arr = 'foo' // You cannot do that

arr.push(6) // That works fine. result: [0,1,2,3,4,5,6]