JavaScript 的 const 竟然不完全是变量不变
在 JavaScript 中,声明一个变量通常有三种方式:var、let 和 const。其中,const 声明的变量被认为是一个常量,其值在声明后不能再次被改变,因此被广泛用于存储不变的数据。
然而,随着多年使用经验的积累,我们发现 const 竟然不完全是变量不变。在实际应用中,我们会遇到一些 const 声明的变量在值被赋值后仍然能够被修改的情况,而这并不是一个 bug,而是一个功能。
那么,const 到底有多少种方式可以被修改呢?下面我们来一一探究。
第一种:对象属性的赋值
声明一个 const 变量时,如果变量被赋值为一个对象,那么虽然该变量不能被重新赋值,但是对象属性却可以被修改。
示例代码:
const person = { name: 'John', age: 20 }; person.age = 30; console.log(person); // 输出 { name: 'John', age: 30 }
在上面的代码中,我们声明了一个 const 变量 person,并将它赋值为一个对象。虽然 person 变量不能被重新赋值,但是我们可以修改该对象的 age 属性。
第二种:数组元素的赋值
和对象属性类似,当 const 变量被赋值为一个数组时,数组元素也可以被修改。
示例代码:
const arr = [1, 2, 3]; arr[2] = 4; console.log(arr); // 输出 [1, 2, 4]
在上面的代码中,我们声明了一个 const 变量 arr,并将它赋值为一个数组。虽然 arr 变量不能被重新赋值,但是我们可以修改该数组的元素。
第三种:全局对象的属性赋值
在浏览器环境中,window 对象是全局变量,可以通过 window.xxx 的方式访问对象的属性。在 Node.js 环境中,global 对象是全局变量,可以通过 global.xxx 的方式访问对象的属性。
因此,当 const 变量被赋值为全局对象的属性时,该属性也可以被修改。
示例代码:
const FLAG = { color: 'red' }; window.FLAG.color = 'blue'; console.log(FLAG); // 输出 { color: 'blue' }
在上面的代码中,我们声明了一个 const 变量 FLAG,并将它赋值为一个对象。虽然 FLAG 变量不能被重新赋值,但是我们可以通过 window 对象来修改该对象的 color 属性。
结论
综上所述,const 变量虽然不能被重新赋值,但是它所包括的对象属性、数组元素和全局对象属性却可以被修改。在实际编码过程中,我们需要根据这种特性来合理运用 const 变量,防止出现不必要的错误。
参考文献
- 阮一峰《ECMAScript 6 入门》
- MDN Web Docs:const
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66efc9256fbf96019730de74