关于ES6的let和const
变量
var存在的问题
- 可以重复声明
- 无法限制修改
- 没有块级作用域 (在全局范围内有效)
- 存在变量提升
const/let
- 不可以重复声明
let a = 1;
let a = 2;
var b = 3;
var b = 4;
a // Identifier 'a' has already been declared
b // 4
- const 不可以修改(定义常量)、let 可以修改(定义变量)
{
let a = 0;
var b = 1;
}
a // ReferenceError: a is not defined
b // 1
- 有块级作用域
for (var i = 0; i < 10; i++) {
setTimeout(function(){
console.log(i);
}
}
// 输出十个 10
//由于var声明的变量i是在全局范围内有效,所以全局中只有一个i,setTimeout定时器里面的i指的是全局变量i,而循环里的是个setTimeout是在循环结束后才执行的,所以此时的i都是10。
// 可以利用函数function来解决该问题
for (var i = 0; i < 10; i++) {
(function (i){
setTimeout(function(){
console.log(i);
}
})(i)
}
// 输出 0123456789
for (let j = 0; j < 10; j++) {
setTimeout(function(){
console.log(j);
})
}
// 输出 0123456789
// 每次循环都是一个新的变量
// 问题来了,若每次循环的变量 j 都是重新声明的,如何知道前一个循环的值?这是因为 JavaScript 引擎内部会记住前一个循环的值
- 不存在变量提升
console.log(b); //undefined
var b = "banana";
// 变量b用var 来声明,存在变量提升,当脚本运行时,b已经存在了,但是还没有赋值,所以会出现undefined
console.log(a); //ReferenceError: a is not defined
let a = "apple";
- const声明一个只读变量,声明之后不允许改变。意味着,一旦声明,必须初始化,否则会报错。
const a = 1;
const b; // SyntaxError: Missing initializer in const declaration
问题来了,为什么const可以在变量声明初始化之后不允许改变呢?
const 其实保证的不是变量的值不变,而是保证变量指向的内存地址所保存的数据不允许变动。
问题又来了,不同数据类型(简单类型,复合类型(或称引用类型))保存值的方式是不同的。
对于简单类型(number,string,boolean),值就保存在指向的内存地址,因此const声明的简单类型变量等同于常量。
对于复合类型(object,array,function),变量指向的内存地址其实保存了一个指向实际数据的指针,所以const只能保证指针是固定的,至于指针指向的数据结构就无法保证其不改变,所以const声明复杂类型对象时要慎重。
这其中涉及到了,简单类型和复合类型的保存方式
- 基本类型值在内存中占固定大小的空间,因此被保存在栈内存中
- 复合类型的值是对象,保存在堆内存中
当两者分别进行变量复制的时候
- 基本类型:会在变量对象上创建一个新值,然后把该值复制到为新的变量分配的位置。
var num1 = 1;
var num1 = num2;
| num1 | 1 (number类型) |
复制后的变量对象
| num2 | 1(number类型) |
| num1 | 1 (number类型) |
- 复合类型:
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Tom";
alert(obj2.name);// "Tom"

关于ES6的let和const的更多相关文章
- es6(一):es6介绍以及let,const
es是js的规范,而js是具体实现 将es6转化为es5代码工具:运用的多的是babel 在线转换地址:babel,traceur(属于谷歌) 1.let申明变量:let其实可以完全取代var,并 ...
- es6之let和const
在javascript中,我们都知道使用var来声明变量.javascript是函数级作用域,函数内可以访问函数外的变量,函数外不能访问函数内的变量. 函数级作用域会导致一些问题就是某些代码块内的变量 ...
- ES6(let 和 const)
一项新技术的出现肯定是为了解决一些问题,那么ES6的出现主要是解决了哪些问题?它的出现给我们带来了什么便利?当它没有出现的时候,某些问题怎么处理?ES6的方法和以前的方法比较又有什么不同呢?根据提出的 ...
- ES6 之 let和const命令 Symbol Promise对象
ECMAScript 6入门 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了. (2016年6月,发布了小幅修订的<ECMASc ...
- es6之let和const命令的一些笔记
let和const命令 let命令 基本用法 let命令用来声明变量,声明的变量只在命令所在的代码块内有效.for循环中很适合使用let命令. 有必要理解的例子: var a = []; for (v ...
- JavaScript ES6 的let和const
1 作用域和提升 1.1 作用域(Scope) 某个变量名或者函数名,在某个程序片段中是否可见或者可访问,如果是,那么这个程序片段就是这个变量名或者函数名的作用域.比如: var name = &qu ...
- ES6中var/let/const的区别
let的含义及let与var的区别: let 声明的变量只在它所在的代码块有效: 如下: for (let i = 0; i < 10; i++) { console.log(i); } con ...
- ES6系列之let/const及块级作用域
本系列是在平时阅读.学习.实际项目中有关于es6中的新特性.用发的简单总结,目的是记录以备日后温习:本系列预计包含let/const.箭头函数.解构.常用新增方法.Symbol.Set&Map ...
- ES6 中 let and const
let 和 const 命令 let 命令 基本用法 ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = 10; v ...
- ES6中let与const命令详解
阮一峰ES6入门 let 作用域 let命令用来声明变量,但声明的变量只在let命令所在的代码块内有效. { let a = 10; var b = 1; } a // ReferenceError: ...
随机推荐
- 基于node的前端项目编译时内存溢出问题
解决方法: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory JavaScript堆内存不足,这里说的 Jav ...
- HTML5如何垂直居中一个浮动元素
html如何垂直居中一个浮动元素//方法一:已知元素的高宽#div1{background-color:#6699FF;width:200px;height:200px;position:absolu ...
- jvm基础知识1
堆放实例对象,栈放实例对象的引用,方法区存储创建类的信息 上面堆和垃圾回收的关系,垃圾回收回收的是堆内存的数据,s0和s1区域, 例如现在我们要清除s0中的堆对象,将s0中正在运行的对象从s0区域移动 ...
- Python函数参数详解
Python函数参数详解 形参与实参 什么是形参 在定义函数阶段定义的参数称之为形式参数,简称形参,相当于变量名. 什么是实参 在调用函数阶段传入的值称为实际参数,简称实参.相当于"变量值& ...
- java中HashMap和Hashtable的区别
1.HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下, ...
- 入门大数据---Hive视图和索引
一.视图 1.1 简介 Hive 中的视图和 RDBMS 中视图的概念一致,都是一组数据的逻辑表示,本质上就是一条 SELECT 语句的结果集.视图是纯粹的逻辑对象,没有关联的存储 (Hive 3.0 ...
- dart快速入门教程 (4)
4.流程控制 4.1.分支结构 1.if语句 void main() { int score = 80; if (score >= 90) { print('优秀'); } else if (s ...
- vue基础入门(2.2)
2.2.基础指令 2.2.1.什么是指令 指令 (Directives) 是带有 v- 前缀的特殊特性,指令特性的值预期是单个 JavaScript 表达式,指令的职责是,当表达式的值改变时,将其产生 ...
- js事件入门(1)
1.事件相关概念 1.1 什么是事件? 事件是用户在访问页面时执行的操作,也就是用户访问页面时的行为.当浏览器探测到一个事件时,比如鼠标点击或者按键.它可以触发与这个事件相关的JavaScript对象 ...
- 使用Xmanager连接linux,操作“xhost +”时出现类似“xhost: unable to open display "192.168.1.1811:1.0" ”问题的解决
远程连接linux服务器时,有的时候需要把服务器上的图形界面投影到本地来进一步操作,比如linux下安装oracle时就需要在oracle用户下允许视图状态投影到本地,这需要使用命令: xhost + ...