1. 不属于顶层对象window
    2. 存在块级作用域
    3. 存在暂时性死区
    4. 不存在变量提升
    5. 不可以重复声明
    6. 定义的值不能被修改 ```javascript const a = 1 a = 2 // error

    console.log(b) // error const b = 3;

    if (true) { console.log(b); // error const b = 1; }

    if (true) { const a = 1; } console.log(a) // error

    1. js中定义的基本数据类型的值都被存储在栈内存中,引用数据类型的值保存在堆内存中,其中在栈内存中的引用类型变量指向堆内存中的引用类型的值(栈中存储的是地址)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/22242642/1648131509715-d47c5edc-5087-4deb-9c43-d7d1b2fd4980.png#clientId=u2b67ac7b-5f1a-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=713&id=u259ba011&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1426&originWidth=2498&originalType=binary&ratio=1&rotation=0&showTitle=false&size=2307378&status=done&style=none&taskId=u7ed839e2-68f4-4f02-9291-c015403ccf0&title=&width=1249)
    2. const定义的变量,普通类型的变量的值无法直接更改,引用类型的存储引用地址无法更改(在栈内存中),但是存储在堆内存中的值可以更改。
    3. 令引用类型的变量值(堆内存中的值)无法更改:<br />使用`Object.freeze(a);`可以实现冻结引用类型的变量,单层冻结。<br />如要实现多层冻结,需要手动递归冻结内部对象。
    4. ```javascript
    5. const a = {
    6. name: 'zza',
    7. age: 12,
    8. skills: {
    9. name: 'code'
    10. }
    11. }
    12. console.log(a)
    13. Object.freeze(a);
    14. Object.freeze(a.skills);
    15. a.name = 'zzazza'
    16. a.skills.number = 12
    17. console.log(a)

    分析:在实际的项目开发中,应该尽量少的使用var,使用const、let将其代替。