- 使用const声明的数组可以被修改吗?
- 听到这个问题后第一反应是const声明常量,所以不能被修改,但是当我非常犹豫地回答“不能”时,就知道我错了!
- const声明的变量确实是常量,“不能修改”的意思是不能重新分配该变量的值。但对于数组和对象这样的复合数据类型,const仅保证了变量指向的内存地址不会改变,而不能保证该地址指向的数据结构不可变。也就是说,const声明的数组,不能对整个数组重新赋值,但可以通过改变数组的元素来实现对数组内容的修改,即调用数组方法比如
push()、pop()、shift()、unshift()等来添加、删除或修改数组元素(因为这些数组方法操作的是数组元素,而不是数组本身)。例如:const myArray = [1, 2, 3]; myArray[0] = 5; // 可以修改数组中的元素 myArray.push(4); // 可以向数组中添加元素 console.log(myArray); // 输出 [5, 2, 3, 4] // 以下操作是不允许的 // myArray = [6, 7, 8]; // 尝试重新分配给另一个数组会报错 ``` - 今天学习【数组的解构赋值-交换数组中两个元素的位置】时遇到的情况:
const arr = ['wukong', 'bajie']; [arr[0], arr[1]] = [arr[1], arr[0]];//正确写法 arr = [arr[1], arr[0]];//大错特错!注意const定义的arr不能直接对整个数组重新赋值 console.log(arr) - 对象同理:可以修改对象的属性,不能对整个对象重新赋值。如果需要保护对象属性不被修改,可以使用
Object.freeze()方法冻结对象,使其属性变为只读,即对象变成一个常量。例如:const obj = Object.freeze({name:'b',age:18}); obj.age = 10; // 无效操作 console.log(obj); //{name:'b',age:18}
参考文章:前端每日一问:const定义数组,还能push元素吗?为什么?const a = {}能否改变对象属性?如果不能 改变要怎么做: