1 JS中可以声明常量吗?
1.var
- 允许变量重名,覆盖前面
- 属于顶层对象window
- 变量提升
2. ES3中通过 var BASE_URL='' 大写字母表示常量,但是也允许更改
3.ES5
Object.defineProperty(window, 'es', {
value: '2015',
writable: false // 不可写
})
4.ES6 const
- 不允许重复声明
- 不属于顶层对象window
- 不存在变量提升
- 暂时性死区(不能在声明之前使用)
- 块级作用域
2.Let
- let 声明的全局变量不是全局对象window的属性
- 用let定义变量不允许重复声明
- let声明的变量不存在变量提升
-
let声明的变量具有暂时性死区
-
let 声明的变量拥有块级作用域
2 const声明的常量真的不可以改变吗?
const esObj = {
name: 'es6',
year: 2015,
extension: ['es7', 'es8', 'es9']
}
esObj.name = '2015' //改变了
//解决方法
Object.freeze(esObj) // 只能冻结第一层
const arr = ['es6', 'es7', 'es8']
arr[0] = '2015' //改变了
function myFreeze(obj) {
Object.freeze(obj)
Object.keys(obj).forEach(function(key) {
if (typeof obj[key] === 'object') {
myFreeze(obj[key])
}
})
}
数据存储相关
基本数据类型 存储在栈内存中:String, Number,Boolean, Null, Undefined, Symbol
引用数据类型 存储在堆内存中:object、array、function、data等