由于 const 无法在 JavaScript 中创建不可变数组(我不知道确切原因),那么创建不可变数组的最佳方法是什么?

Eme*_*eus 2 javascript

在我看来,这个问题This question无关,我试图了解有关 javascript 核心的一些行为,我不想要库或其他东西。

我试图理解为什么这段代码实际上会修改 const originalArray

const originalArray = [0, 2, 1, 1, 1];

var newArray = originalArray;

var removed = newArray.splice(0,3);

console.log(originalArray);//return [ 1, 1 ]
Run Code Online (Sandbox Code Playgroud)

但同时这是不可能的:

const originalArray = [];
originalArray = [1];  
Run Code Online (Sandbox Code Playgroud)

那么,如何在没有库的情况下创建真正不可变的数组?

Riv*_*Tam 6

修改newArray也修改的原因originalArray是因为 JavaScript 中的变量只是对对象的引用。当您说 时newArray = originalArray,您不是在复制数组,而是在复制引用。因此,当您说 时newArray.splice(0, 3),您正在修改由 引用的数组newArray,该数组originalArray 引用了。

同样,在 JavaScript 中,这个词const指的是引用是常量,而不是底层对象。也就是说,您可以像.spliceconst变量上一样调用变异方法而不会出现问题。当您尝试使用=或类似方法重新分配变量时,您会遇到错误。

正如其他人所指出的那样,Object.freeze(_)将使您无法修改内部对象,从而实现“不变性”,因为您将无法修改底层对象。

例如,如果您执行以下操作:

const originalArray = Object.freeze([1, 2, 3]);
let newArray = originalArray; // you can easily use `const` here, but I don't want to confuse the two concepts
newArray.splice(0, 3); // TypeError: Cannot add/remove sealed array elements
Run Code Online (Sandbox Code Playgroud)

如果您想要一个可以修改而无需修改原始数组的数组副本,Object.freeze仅靠它是无济于事的。您将想要“深度复制”数组,这可以通过各种方法完成(很容易在 Google 上使用,因此我将编辑它们,因为这个答案比预期的要长)。