我对let和const理解
let和const是es6新出的两种变量声明的方式,接下来我来分别针对这两个,聊一聊。
let
let它的出现,我认为主要是解决了块级作用域的需求。因为js以前本身是没有什么块级作用域的概念的(顶多就算上一个函数作用域),因此这也导致了很多变量污染的问题,很多时候由于你没有处理好作用域的影响,导致了奇怪的问题。因此我们一般都采取函数作用域的方式来防止变量的污染。不过既然有了let的出现,我们就可以很方便的解决这个问题.
块级作用域
for (var i = 0; i < 5; i++) {
console.log(i)
}
console.log(i) // 5
for (let j = 0; j < 5; j++) {
console.log(j)
}
console.log(j) // error: j is not defined
如上所示,如果我们在循环内部使用var声明一个变量的话,当循环结束后,该变量并没有被回收,而当我们使用let的时候,当离开这个块的时候,该变量就会回收。
暂时性死区
var i = 5;
(function hh() {
console.log(i) // undefined
var i = 10
})()
let j = 55;
(function hhh() {
console.log(j) // ReferenceError: j is not defined
let j = 77
})()
看以上代码,由于var它具有变量提升的功能,所以该声明语句会移到最上面执行,也就是等价于以下代码:
var i = 5;
(function hh() {
var i
console.log(i) // undefined
i = 10
})()
let j = 55;
(function hhh() {
console.log(j) // ReferenceError: j is not defined
let j = 77
})()
但是,如果将var换成let的话却会报错,如果说,let是没有变量提升的话,那么应该是直接输出55,而不应该报错啊。
其实,这个特性叫做临时性死区,也可以把它当成变量提升的一种特殊情况.也就是说,当你在一个块里面,利用let声明一个变量的时候,在块的开始部分到该变量的声明语句之间,我们称之为临时性死区,你不可以在这个区域内使用该变量,直到遇到其let语句为止。比如:
var i = 5; // j的临时性死区
(function hh() {
var i
console.log(i) // undefined
i = 10
})() // j的临时性死区
// j的临时性死区
let j = 55; // 接下来可以愉快的使用let了
console.log(j)
console.log(j+10)
(function hhh() {
console.log(j) // 新的j的临时性死区
let j = 77 //又有一个声明语句,从这个函数的开始部分到这里,都是新的j的临时性死区
})()
之所以说它是变量提升的一种特殊情况,是因为无论你在块的哪一个地方利用let声明了一个变量,都会产生一个从块的开始部分到该变量声明语句的临时性死区.
比较安全可靠:对var或者是直接声明全局变量来说,变量都可以未声明或者在声明语句之前就使用,而使用了let之后,该变量必须在其声明语句后,才能使用,否则就会报错。这就在一定程度上避免了变量滥用的情况。
const
const,顾名思义,就是声明一个常量,但是,真的是这样吗?
对基本类型而言
对于基本的类型而言的话,比如number,string,boolean等来说,确实它就是声明一个不会变的常量,只要你修改了它,就会报错
const a = 1
a = 2 // Uncaught TypeError: Assignment to constant variable.
const b = '1231'
b = 'xcv' // Uncaught TypeError: Assignment to constant variable.
const c = true
c = false // Uncaught TypeError: Assignment to constant variable.
对引用类型而言
不过,对于引用类型而言的话,它指的并不会对象的内容不变,而是对象的地址不变。也就是说,你可以修改对象的内部成员,但是你不可以修改该变量的地址。
const obj = {
name: 'cjg'
}
obj.school = 'sysu'
console.log(obj) // Object {name: "cjg", school: "sysu"}
obj = {} // VM183:6 Uncaught TypeError: Assignment to constant variabl
其实,就我个人理解,const无论是作用于基本类型还是引用类型,它都是为了保证变量的地址不发生改变(因为你对基本类型而言,你给它赋一个新值,其实也就意味着修改了该变量的地址)
我对let和const理解的更多相关文章
- C++ const 理解
转载自:https://www.cnblogs.com/jiabei521/p/3335676.html 如果函数需要传入一个指针,面试官可能会问是否需要为该指针加上const,把const加在指针不 ...
- js中var,let,const理解
var变量提升: 解释:在声明a之前输出a,因为a是使用var声明变量得到提升,解释为下句 var a: console.log(a) a = 1; var声明会提到最上面的位置,但是赋值的位置还是当 ...
- const理解
const int * a4 = &a1; ///const data,non-const pointer int * const a5 = &a1; ///non-const dat ...
- c语言伪常量const理解
const是伪常量,无法用于数组的初始化和全局变量的初始化,本质就是限定一个变量不能直接赋值. 如以下代码: #define A 10 int arr[A]; //const本质,伪常量 ,无法用于数 ...
- c++ primer 中讲的顶层const 和 底层 const 理解
c++ primer 中讲的 顶层const 和 底层 const 以前没搞懂的顶层const和底层const,这次看了后感觉明白了. 首先,const是一个限定符,被它修饰的变量的值不能改 ...
- const char * 的终结贴(看完无需其他任何文章,从此不再蛋疼)
我之前也是以为我对const char *ptr 这种形式的写法是掌握了的,真的,不就是说一个指针是不可改变的吗? 那么问题就来了,到底是ptr指针本身不能改变,还是ptr执行的值不能改变呢? 从网上 ...
- 比较常见的const与指针的组合情况
1.对于普通的const与基本类型组合,都是表示的是这是一个常量, const int a; int const a; 表示的意思是一样的,a是一个常量,不可改变 2.对于const与指针组合在一起, ...
- readonly const
readonly:只读域,只能在初始化--声明初始化或构造器初始化--的过程中赋值,其他地方不能进行对只读域的赋值操作,否则编译器会报错.只读域可以是实例域也可以是静态域.只读域的类型可以是C#语言的 ...
- C语言指针的陷阱
C语言指针的陷阱 分类: C/Cpp 转自:http://blog.csdn.net/porscheyin/article/details/3461670 “C语言诡异离奇,陷阱重重,却获得了巨大 ...
随机推荐
- wpf动态增加删除控件
我在xaml中定义了一个名字为morepictureWrapPan为WrapPanel,然后将控件添加在此WrapPanel中.由于要实现控件的删除功能,所以增加的textbox和button的名字都 ...
- 一场IPFS引领下的共享之风正在走向区块链
中国互联网的高速发展 已经接近10年,小编完整的经历这个过程.这一切我们从一个小网站 饭否 说起... 互联网 2006年3月16:Twitter上线 2007年5月12: 饭否上线 饭否是中国第一 ...
- EOS 新增的 WebAssembly 解释器,是什么鬼?
Daniel Larimer 在最近的博客中透露,EOS 新增了官方的 WebAssembly 解释器,用来解释执行 WebAssembly 智能合约,加上之前的编译执行,EOS 智能合约有了两种执行 ...
- Linux最佳的云存储服务分析
什么样的云服务才适合作为 Linux 下的存储服务?兄弟连www.itxdl.cn来帮大家分析一下! 大量的免费空间.毕竟,个人用户无法支付每月的巨额款项. 原生的 Linux 客户端.以便你能够方便 ...
- maven 技术总结
1.版本统一控制 在 properties中配置一个参数,在添加依赖时 通过 version标签 限定版本 <properties> <org.springframework.ver ...
- [POJ1631] nlogn求LIS
用到了algorithm自带的lower_bound函数进行二分查找 #include<cstdio> #include<cstring> #include<algori ...
- 笔记:Maven 仓库及配置详解
本地创建默认路径在 用户目录\.m2\repository,如果需要自定义本地创建目录地址,可以编辑文件 用户目录\.m2\settings.xml(文件不存在,则需要从Maven安装目录的Conf目 ...
- Jmeter4.0----安装教程(2)
1.检查安装环境 1.1 JDK要求 JDK版本:1.6 + 1.2 检查是否安装JDK win + R 快捷键打开运行,输入 cmd 打开面板,在面板中输入 java -version,出现如下信息 ...
- 【Python】 xml转json
虽然python有解析xml的模块,也有生成json的模块,但是没有把这两者连接起来的模块. 下面是以来自MIT的大神Martin Blech写的一个方便的模块,供大家参考.也别忘了在用之前先拜谢作者 ...
- nuxt 的一些报错和插件推荐
1.项目有启动报这个错误的,是因为node版本太低了,nuxt要求node版本要达到8.0.0以上 . 2.插件推荐