let、const【ES6】

‌"我唯一知道的就是我一无所知。" - 苏格拉底

目录

块级作用域:

块级作用域指由 {} 包围的代码块(如 if、for、while、单独代码块等)形成的独立作用域,‌ES6‌ 的 let 和 const 声明的变量仅在当前块内有效。在代码块内部声明的变量只能在该代码块内访问。

var、let、const的对比:

特性 var let const
作用域 函数作用域(在函数内部使用var声明)/ 全局作用域(在函数外/没有被任何函数包围) 块级作用域 块级作用域
重复声明 允许在同一个作用域多次声明一个变量 不能(会报错) 不能(会报错)
变量提升 存在(初始为undefined) 不存在传统意义上的变量提升 不存在传统意义上的变量提升
暂时性死区(TDZ) 不存在 存在‌ 存在
重新赋值 必须初始化且一旦赋值后就不能改变其值 【1】
全局对象的属性【与顶层对象挂钩】 声明的全局变量会成为window对象的属性 在全局作用域声明的变量不会成为window的属性,即window.let声明的变量打印出来是undefined 与let同理

解释【1】 :但是const如果声明的是一个对象(数组)那么对象或数组的内容是可以被修改的。这意味着我们可以添加、删除或更改对象属性,或者向数组中添加、删除或修改元素。但是,我们不能将const变量重新指向一个新的对象或数组。const 保证对象的引用不便,而不是值不变。
举例:

javascript 复制代码
const myobj = {
      name: 'ssy',
      age: 18
    }
    myobj.name = 'kitty'
    console.log(myobj);

打印结果:

如果我就是不想让它改变呢?

可以使用我们的 Object.freeze() Object.freeze()方法,它用于创建一个不可变的对象‌。

Object.freeze():

Object.freeze()方法会冻结一个对象,冻结之后不能向这个对象添加新的属性,不能修改其已有属性的值,也不能删除已有属性。该方法返回被冻结的对象本身‌。Object.freeze()冻结的是对象的值,而不是变量的引用

注意:对于嵌套对象,Object.freeze()只会冻结第一层属性,而不会递归冻结。

javascript 复制代码
const myobj = Object.freeze({
      name: 'ssy',
      age: 18
    })
    myobj.name = 'kitty'
    console.log(myobj);
相关推荐
Moment7 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
爱敲代码的小鱼7 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax
铅笔侠_小龙虾9 小时前
Flutter 实战: 计算器
开发语言·javascript·flutter
大模型玩家七七9 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
2501_9447114310 小时前
JS 对象遍历全解析
开发语言·前端·javascript
发现一只大呆瓜10 小时前
虚拟列表:支持“向上加载”的历史消息(Vue 3 & React 双版本)
前端·javascript·面试
阔皮大师11 小时前
INote轻量文本编辑器
java·javascript·python·c#
lbb 小魔仙11 小时前
【HarmonyOS实战】React Native 表单实战:自定义 useReactHookForm 高性能验证
javascript·react native·react.js
_codemonster11 小时前
Vue的三种使用方式对比
前端·javascript·vue.js
全栈前端老曹11 小时前
【MongoDB】Node.js 集成 —— Mongoose ORM、Schema 设计、Model 操作
前端·javascript·数据库·mongodb·node.js·nosql·全栈