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