在我看来,这个问题与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)
那么,如何在没有库的情况下创建真正不可变的数组?
修改newArray也修改的原因originalArray是因为 JavaScript 中的变量只是对对象的引用。当您说 时newArray = originalArray,您不是在复制数组,而是在复制引用。因此,当您说 时newArray.splice(0, 3),您正在修改由 引用的数组newArray,该数组originalArray 也引用了。
同样,在 JavaScript 中,这个词const指的是引用是常量,而不是底层对象。也就是说,您可以像.splice在const变量上一样调用变异方法而不会出现问题。当您尝试使用=或类似方法重新分配变量时,您会遇到错误。
正如其他人所指出的那样,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 上使用,因此我将编辑它们,因为这个答案比预期的要长)。
| 归档时间: |
|
| 查看次数: |
1332 次 |
| 最近记录: |