js使用const的好处_let和const命令
let命令
块级作用域
ES6新增了let命令,用于声明变量,其用法类似于var,但是所声明的变量只在let命令所在的代码块内有效
像上面例子,var声明的i是全局的,全局只有一个i,所以会输出i的最后的结果10,而let声明的i是仅在块级作用域中有效,所以输出的是6
不存在变量提升
var命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined。let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则便会报错。
暂时性死区
只要块级作用域内存在let命令,它所声明的变量就“绑定”这个区域,不再受外部的影响在代码块内,使用let命令声明变量之前,这些变量都是不可用的
暂时性死区的本质就是,只要进入当前作用域,所要使用的变量就已经存在,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量
不允许重复声明
let不允许在相同作用域内重复声明同一个变量
块级作用域
什么是块级作用域
任何一对花括号({和})中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域
为什么要有块级作用域
ES5中只有函数作用域和全局作用域,没有块级作用域,这会导致一些场景不合适
变量非预期的重复覆盖
因为判断里的tmp变量提升,所以覆盖掉了第一个tmp的值,导致第一个输出是undefined
用于循环计数的变量泄露为全局变量
很多情况下,像这样的i,开发者只是定义用来控制循环,循环结束后却并没有消失,而是泄露为了全局的变量
ES6的块级作用域
之前ES5中我们需要实现类似块级作用域的效果是使用立即执行函数
ES6中,let实际上为js新增了块级作用域,使得立即执行函数不再必要了。
const命令
const声明一个只读的常量,一旦声明,常量的值就不能改变,因为const声明的变量不得改变值。这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。
const的作用域与let命令相同:只在声明所在的块级作用域内有效,const命令声明的常量也不会提升,同样存在暂时性死区,只能在声明后使用。使用const声明常量也与let一样,不可重复声明。
栈内存和堆内存
为什么这里突然要介绍栈内存和堆内存呢,这和后面将要介绍的const命令的本质有关。
javaScript中的变量分为基本类型和引用类型。
基本类型是保存在栈内存中的简单数据段,它们的值都有固定的大小,保存在栈空间,通过按值访问
引用类型是保存在堆内存中的对象,值大小不固定,栈内存中存放的该对象的访问地址指向堆内存中的对象,js不允许直接访问堆内存中的位置
const的本质
const实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。但对于复合类型的数据而言,变量指向的内存地址保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,这完全不能控制。因此,将一个对象声明为常量时必须非常小心。也就是说对象常量不可变的只是这个地址,即不能把foo指向另一个地址,但对象本身是可变的,依然可以为其添加新属性
如果真的想将对象冻结,应该使用Object.freeze方法
小伙伴们今天的学习就到这里了,如果觉得本文对你有帮助的话,欢迎转发,评论,收藏,点赞!!!
每天学习进步一点点,就是领先的开始。如果想继续提高,欢迎关注我,或者关注公众号”祯民讲前端“。大量前端技术文章,面试资料,技巧等助你更进一步!
js使用const的好处_let和const命令相关推荐
- JS红书宝--var,let和const声明变量
var,let和const声明变量 var 声明 var声明作用域 function test() { var message = "hi"; // 局部变量 } test(); ...
- 让我们探索Cycle.js和Model-View-Intent的好处
by Fabio Hiroki 由Fabio Hiroki 让我们探索Cycle.js和Model-View-Intent的好处 (Let's explore the benefits of Cycl ...
- 2020-09-21C++学习笔记之与C语言区别和加强——四种const意义(const int a; int const b; const int *c; int * const d)
2020-09-21C++学习笔记(const int a; int const b; const int *c; int * const d) 这两天在上课更新晚了. 1.C/C++中的const ...
- C++之const类成员变量,const成员函数
const修饰类的成员函数 const修饰变量一般有两种方式:const T *a,或者 T const *a,这两者都是一样的,主要看const位于*的左边还是右边,这里不再赘述,主要来看一下当co ...
- 【C 语言】const 关键字用法 ( 常量指针 - const 在 * 左边 - 修饰数据类型 - 内存不变 | 指针常量 - const 在 * 右边 - 修饰变量 - 指针不变 )
文章目录 一.const 普通用法 二.常量指针 ( 指向 常量 的指针 | 被指向的内存不能被修改 ) 三.指针常量 ( 指针不能被修改 ) 三.指向 常量 的 指针常量 四.const 在 * 左 ...
- c语言常量的正确表示const,C语言中的const和free用法详解
注意:C语言中的const和C++中的const是有区别的,而且在使用VS编译测试的时候.如果是C的话,请一定要建立一个后缀为C的文件,不要是CPP的文件.因为,两个编译器会有差别的. 一.C语言中的 ...
- const char * array[]和char * const array[]
int main() {char abc[] = "abc";char def[] = "def";char * const array[] = {" ...
- html框架有什么作用,使用HTML5+CSS+JS框架有那些好处
使用HTML5+CSS+JS框架有那些好处 2017-12-08 相信很多程序猿朋友都用过框架,不过你是否知道你用的是HTML框架.CSS框架还是JS框架,其实这都不重要,重要的是使用框架的目的是什么 ...
- const int *a和int*const a 的区别详解
补充知识 "const int i"与"int const i"之间的区别 对变量来说,const 关键字可以限定一个变量的值不允许改变,从而保护被修饰的东西, ...
最新文章
- c#百度排名点击器编写 及webser 填表.
- 分布式事务,阿里为什么钟爱TCC
- 在Elasticsearch中查询Term Vectors词条向量信息
- [C++基础]025_虚函数和虚函数表
- 三层神经网络实现手写数字的识别(基于tensorflow)
- Linux性能优化实战:应用的CPU使用率100%,我该怎么办(05)
- 3.30作业(采购管理+信息管理)
- CAD中把样条曲线改成多线段
- 细节至上——Splus微博设计之界面篇(转)
- java调用百度语音接口
- css border-image 图片边框
- 计算机输入什么指令关机,电脑关机命令是什么 电脑关机命令详解
- 微信 html5 声音,Html5-video ,播放视频有声音无画面(微信H5页面)
- 第二章 复杂的HTML解析(上)
- 《当下的启蒙》的概述和精华
- node.js邮箱验证码
- 贴片电容COG、NPO 、X7R、X5R、Y5V介质区别
- React中antd日期选择框,指定区间禁用时间
- 一个有用的视频播放器VLC
- 费希尔阀门定位器DVC6200的调试
热门文章
- power接口 sata_sata硬盘不接power接口读的出来吗
- python什么是堆什么是栈_python中堆和栈_Python小知识00002
- mysql 压缩备份_备份压缩mysql 数据库
- android php实时聊天工具,Android_Android 应用APP加入聊天功能,简介
自去年 LeanCloud 发布实时 - phpStudy...
- rabbitmq消息保证幂等的消息设计
- (转)Clang 比 GCC 编译器好在哪里?
- python_线程读写操作一
- django准备 —环境配置,及其虚拟环境安装、django安装、数据库安装、新建项目...
- Layui导航、面包屑
- [GO]无缓冲通道(unbuffered channel)