Javascript const是多变的?

时间:2018-04-21 15:10:20

标签: javascript ecmascript-6

我正在尝试从arMin中删除最大值,并从arMax中删除最小值,但是arr(是一个const!)也会发生变化!我不知道为什么。我使用的是Google Chrome版本65.0.3325.181。 'arr'只宣告了一次,它不应该做任何事情。我无法理解。尝试删除,但它将数字转换为'空',但工作相同并改变常量! 这是我的第一篇文章,所以如果我做错了,请原谅我。

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]

5 个答案:

答案 0 :(得分:1)

arr的值是对数组的引用。

你不能改变它。 总是是对该数组的引用。

但是数组是可变的,因此您可以更改数组中的值。 const无法阻止这种情况。

如果您希望arMinarMax成为不同的数组,那么您需要复制数组而不只是复制arr的值(这是对{1}}的引用那个数组)。

答案 1 :(得分:0)

const使引用成为常量,而不是值。

你不能让arr指向别的东西,但你可以改变它的价值。


注意:其他语言Dart comes to mind可以指定常量值。这不是JavaScript的情况。

答案 2 :(得分:0)

要完成上一个答案,要制作数组的精确副本而不是复制引用,您应该执行以下操作:

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, 4, 5];
arr.push(6); // Is allow.

const object: {id: number, title: string} = {id: 1, title: 'Yanis'};
object.id = 2; // Is allow.

const myString: string = 'yanis';
myString = 'Jackob'; // Not allow.

答案 3 :(得分:0)

当你创建数组const时,你不能改变引用

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;

答案 4 :(得分:0)

作为常量,您无法重新分配其值,在这种情况下,它包含对数组的引用。

但阵列本身并不是一成不变的。

一个例子是:

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]