es6学习笔记--let和const
今天学习了es6中的let和const命令,借此整理一下笔记。
let :
let 和 var 的声明方式一样,但有 var 比不上的优点。下面用 var 和 let 的例子来加深对 let 的理解。
1 let 只作用与当前作用域中
在声明var时,在无特别情况下,代码块里的var外部也可以访问到的,但是let声明之后,外部是访问不到的,会报错。
{
var a = 123
let b = 456
}
console.log(a) //
console.log(b) // ReferenceError: b is not defined
以前面试经常出现的一道题,下面会打印出什么
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[5]();
结果是 10 ,这就是 var i 没有指定块级作用域,指向了全局。变量i
是var
命令声明的,在全局范围内都有效,所以全局只有一个变量i
。每一次循环,变量i
的值都会发生改变,而循环内被赋给数组a
的函数内部的console.log(i)
,里面的i
指向的就是全局的i,
数组a
的成员里面的i
,指向的都是同一个i
,导致运行时输出的是最后一轮的i
的值,也就是 10。
如果使用let,利用它的具有块级作用域的特性,我们可以获取数组a[5]的值。
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[5](); //
为何是5,而不是10 了,因为变量i
是let
声明的,当前的i
只在本轮循环有效,所以每一次循环的i
其实都是一个新的变量,所以最后输出的是5。
另外 let 为javascript添加了块级作用域,使声明的变量只作用与当前的代码块。
function fn() {
let n = 1;
if (true) {
let n = 2;
console.log(n) // 2
}
console.log(n) // 1
}
fn()
而 var 则不会,因为根据var变量声明的原则,if代码块的n重复使用,后面的覆盖前面的。
function fn() {
var n = 1;
if (true) {
var n = 2;
console.log(n) // 2
}
console.log(n); // 2
}
fn()
2 let 不存在变量提升
var
命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined
。这是javascript在预编译过程中,把var声明的变量提升到当前作用域的最上端,变量的值不变。但是let不存在变量提升,如果未声明就使用或者声明在使用之后会报错 ReferenceError。
console.log(a)
var a = 1 // undefined
console.log(b)
let b = 2 // Uncaught ReferenceError: b is not defined
3 let 具有暂时性死区
{
a = 123
b = 456
let a
var b
console.log(a) // Uncaught ReferenceError: a is not defined
console.log(b) //
}
上面的例子的情况就是说明了let的暂时性死区,let a在使用之后,触发了暂时性死区,就报错。而var因为在声明时发生变量提升提到最顶端,所以能打印出456。
4 let 不允许重复变量
{
let a = 1
let a = 2 // Uncaught SyntaxError: Identifier 'a' has already been declared
}
{
var a = 1 // Uncaught SyntaxError: Identifier 'a' has already been declared
let a = 2
}
5 let 使变量不再是默认的全局变量。
var a = 1
console.log(window.a) //
let b = 2
console.log(window.b) // undefined
const:
const 声明一个只读的常量。一旦声明,常量的值就不能改变。
const a = 1
a = 2 // Uncaught TypeError: Assignment to constant variable.
console.log(a)
其本质就是:const一旦声明变量,就必须立即初始化,不能留到以后赋值。
const 的特点和 let 的一样:
1 只作用与当前的块级作用域
2 不存在变量提升
3 也存在暂时性死区
4 不允许重复声明同一个变量
5 使变量不再是全局属性
ps:const 的本质:不是变量的值不得改动,而是变量指向的那个内存地址不得改动。
const a = 'string'
a = 'String' // Uncaught TypeError: Assignment to constant variable.
console.log(a)
const b = {
name: 'peter'
}
b.name = 'Bob'
console.log(b) // {name: "Bob"}
b = {} //error
console.log(b)
a 是字符串,值就保存在地址,不可变,一变就报错
b 是个对象,对象保存的是个地址,是个指针,只要地址不变,里面的内容可以捣鼓,但是如果要把这个对象b初始化等等就相当于改变了地址。
参考资料:
阮一峰大大的es6: http://es6.ruanyifeng.com
es6学习笔记--let和const的更多相关文章
- ES6学习笔记<一> let const class extends super
学习参考地址1 学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...
- ES6 学习笔记 - let和const
let 和 const 命令 学习资料:ECMAScript 6 入门 let 所声明的变量,只在let命令所在的代码块内有效.用途:循环计数器. 如果使用var,只有一个全局变量i: var a = ...
- ES6学习笔记(let,const,变量的解构赋值)
1.let: ; i < 3; i++) { let i = 'abc'; console.log(i); } // abc // abc // abc 不存在变量提升,它所声明的变量一定要在声 ...
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
- ES6学习笔记<四> default、rest、Multi-line Strings
default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...
- ES6学习笔记<三> 生成器函数与yield
为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...
- ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring
接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...
- ES6学习笔记(一)——let和const
1.ES6学习之let.const (1).var.let.const 变(常)量声明 ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景. 在ES6中let就诞生了,实际上它 ...
- es6学习笔记-class之一概念
前段时间复习了面向对象这一部分,其中提到在es6之前,Javasript是没有类的概念的,只从es6之后出现了类的概念和继承.于是乎,花时间学习一下class. 简介 JavaScript 语言中,生 ...
随机推荐
- 第一周 动态规划Dynamic Programming(一)
一.概念 动态规划是运筹学的一个分支,是求解决策过程最优化的数学方法.动态规划是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决. 1.试用情况: 2.解决步骤 ...
- C#中内嵌资源的读取
起因 作为一个从Cpper转到C#并且直接从事WPF开发的萌新来说,正式编码过程中碰到了不少问题,一路上磕磕碰碰的.因为软件设计需求上的要求,需要将一些配置文件(XML.INI等)内嵌到程序中,等需要 ...
- java生产者与消费者模式
前言: 生产者和消费者模式是我们在学习多线程中很经典的一个模式,它主要分为生产者和消费者,分别是两个线程, 目录 一:生产者和消费者模式简介 二:生产者和消费者模式的实现 声明:本例来源于java经典 ...
- Linux中的 awk查找日志中的相关记录
假设要在 api.log.201707201830 文件中,(此文件的多个字段数据以不可见字符^A(键盘上按下Ctrl+V+A)分隔),要输出第70个字段: awk -F '^A' '{print $ ...
- mysql sql_cache缓存使用
有如下规则,如果数据表被更改,那么和这个数据表相关的全部Cache全部都会无效,并删除之.这里"数据表更改"包括: INSERT, UPDATE, DELETE, TRUNCATE ...
- Servlet中文乱码问题解决办法
首先对于源jsp网站和servlet里面的字符集要一样,一般支持中文的字符集为UTF-8最好采用这个字符集(除此之外还有gb2312); 对于源jsp文件的代码中需要设置 设置你的page里面的字符集 ...
- Scrapy-多层爬取天堂图片网
1.根据图片分类对爬取的图片进行分类 开发者选项 --> 找到分类地址 爬取每个分类的地址通过回调函数传入下一层 name = 'sky'start_urls = ['http: ...
- Yii2框架RBAC(Role-Based Access Control)的使用
1.在项目的common/config/main.php文件的components中添加如下代码: 'authManager' => [ 'class' => 'yii\rbac ...
- 老男孩Python全栈开发(92天全)视频教程 自学笔记21
day21课程内容: json: #序列化 把对象(变量)从内存中 编程可存储和可传输的过程 称为序列化import jsondic={'name':'abc','age':18}with open ...
- SmileyFace——基于OpenCV的人脸人眼检测、面部识别程序
项目地址 https://github.com/guoyaohua/SmileyFace 开发环境 Visual Studio 2010 MFC + OpenCV 功能描述 静态图像人脸检测 视频人脸 ...