返回

初探 JS 基础:清空数组,为何 const 也能“修改”?这样用真的可以吗?

前端

初探 JS 基础:清空数组,为何 const 也能“修改”?这样用真的可以吗?

清空数组:哪种方式更优?

在 JavaScript 中,清空数组有多种方式。最常见的方式是使用 length = 0

const array = [1, 2, 3];
array.length = 0;
console.log(array); // []

这种方式简单直观,可以快速地清空数组。但是,它存在一个缺点,那就是它不能释放数组占用的内存空间。这意味着,如果数组很大,那么即使清空了数组,它的内存空间仍然会被占用。

另一种清空数组的方式是使用 splice() 方法:

const array = [1, 2, 3];
array.splice(0, array.length);
console.log(array); // []

splice() 方法可以从数组中删除指定范围的元素。通过将起始索引设为 0,终止索引设为数组长度,可以一次性删除数组中的所有元素。这种方式可以释放数组占用的内存空间,但它的效率比 length = 0 低一些。

const 也能修改数组?

在 JavaScript 中,const 变量被认为是只读的,即一旦被赋值就不能被修改。但是,对于数组来说,情况并非如此。const 变量可以用来声明数组,并且数组中的元素可以被修改。

const array = [1, 2, 3];
array[0] = 4;
console.log(array); // [4, 2, 3]

这是因为 const 变量只禁止重新赋值,但并不禁止修改数组中的元素。这是因为数组是一种引用类型,当将数组赋值给 const 变量时,实际上是将数组的引用赋值给了该变量。因此,虽然无法重新赋值,但仍然可以通过数组引用来修改数组中的元素。

这样用真的可以吗?

虽然 const 变量可以用来修改数组,但这样做并不是一个好习惯。首先,这样做违背了 const 变量的初衷,即只读性。其次,这样做可能会导致难以发现的错误。例如,如果不小心将 const 数组赋值给了另一个变量,那么对该变量的修改也会影响到 const 数组。

因此,在 JavaScript 中,最好不要使用 const 变量来声明数组。如果需要创建一个只读的数组,可以使用 Object.freeze() 方法。Object.freeze() 方法可以将对象冻结,使其无法被修改。

const array = [1, 2, 3];
Object.freeze(array);
array[0] = 4;
console.log(array); // [1, 2, 3]

这样,就可以创建一个只读的数组,并且不会违背 const 变量的初衷。

总结

在 JavaScript 中,清空数组有两种最常见的方式:length = 0splice() 方法。length = 0 的效率更高,但不能释放数组占用的内存空间;splice() 方法的效率较低,但可以释放数组占用的内存空间。在使用 const 变量时,最好不要将其用于声明数组,因为 const 变量只禁止重新赋值,但并不禁止修改数组中的元素。如果需要创建一个只读的数组,可以使用 Object.freeze() 方法。