ES6 let&const
今天来总结一下ES6里面let与const的用法
先总体看一下ES6中的let都有哪些特性:
let 特性
- let声明的变量在js中不可以重复声明,防止变量的污染和覆盖
- let声明的变量不涉及变量的提升,可以有效防止闭包问题
- let声明的变量在块级作用域中有效
- let声明的变量存在暂时性死区
声明的变量在为执行到声明语句时,变量将会暂存在暂时性死区中,当执行完声明 语句时,将会从暂时性死区中将变量取出
1. 同名变量不可以重复声明
var a = 100;
et b = 20; // 报错
2. let声明的变量不存在变量提升的问题
/**
* es6新出的变量定义方式声明的变量不再与全局对象相关联
* 即class , let , const , import 声明的变量不会把变量挂到全局对象上
**/
let num = 10;
console.log(window.num); //undefined
var num2 = 10;
console.log(window.num2); //10
我们都知道,js在全局中声明变量,其实质是哪个就是将该变量挂载到window对象的属性上,因此,在访问全局变量时,与访问window对象的属性是一致的。js的设计者逐渐意识到设计存在问题,因此,逐渐开始全局对象与全局变量进行分离。在使用let或者const,甚至之后的class声明变量,都不再将全局变量挂载全局对象(window或者global上)
3. 在ES6中还引入了块级作用域的概念。
使用let和const声明的变量只在申明语句所在的块级作用域有效。离开了块级作用域,变量的声明失效,因此也不存在变量的提升。
{
var a = 100;
let b = 200;
} console.log(a); // 100
console.log(b); // b is not defined
使用let和const+块级作用域的声明方式可以在某种程度上代替立即执行函数的方式
let vari = 123;
// 立即执行函数解决变量命名冲突问题
(function(){
let vari = 456;
console.log(vari); // 4561
}()) // 块级作用域解决变量重名问题
{
let vari = 789
console.log(vari); // 789
}
console.log(vari); // 123
很显然,利用ES6的块级作用域解决命名冲突更加简洁明了。
4.暂时性死区。
{
/**
* 1. 在块级作用域内允许声明函数
* 2. 函数声明类似于var声明,将变量声明提升到函数作用域或者全局作用域前面,但函数体不提升
* 3. 函数声明提升到所在块级作用域的头部
**/
function f() { console.log('i am in outside!'); }
(function () {
// f(); //f is not a function ,说明函数的声明提升到了函数作用域的头部,在此处已有f变量的声明,其值为undefined
// console.log(f);
if (true) {
// f = 10;
console.log(f); //此处f的值为函数体,说明函数整体提升到了块级作用域的头部
// f = 10;
function f() { console.log('i am in inside!'); }
}
}());
}
在块级作用域中允许申明函数,不过该声明方式与ES5的形式不同,在ES6的块级作用域中声明函数,会将函数的声明部分提升到块级作用域的头部,而函数提不提升。
关于const的用法,其声明特性与let一致,只不过const声明的一般类型变量值是不可以修改的,对于引用数据类型来说是可以修改的。const声明的实质是const声明的对象的栈内存空间不能再改变,而引用变量所指向的堆内存空间是可以改变的。
{
let obj = {
name: 'zhang',
age: 18,
birthday: {
year: 2018,
month: 13,
day: 32
}
};
let myFreeze = (obj) => {
for (let prop in obj) {
// Object.freeze()方法能够是对象属性的值不可改,相当于加上了const声明
Object.freeze(obj);
// 若对象的属性依旧是引用类型,则递归处理
if (typeof (obj[prop]) === 'object') {
// console.log('referencing prop');
myFreeze(obj[prop]);
}
}
return obj;
}
var constObj = myFreeze(obj);
console.log(obj);
obj.birthday.year = 1998; //此处修改属性无效
用上面的递归方式即可将一个对象转换为对象常量,即对象中所有的属性,不可更改。
let与const的出现使得js的变量生命更加规范,因此,建议使用const和let的方式声明变量。
ES6 let&const的更多相关文章
- ES6之const命令
一直以来以ecma为核心的js始终没有常量的概念,es6则弥补了这一个缺陷: const foo='foo'; foo='bar';//TypeError: Assignment to constan ...
- ES6 let const学习
1.let命令:用法类似于var,但是所声明的变量,只在let命令所在的代码块有效. 例:var a = [ ]; for(var i=0;i<10;i++){ a[ i ] = functio ...
- ES6 let const 声明变量 块级作用域
ES6 中除了使用 var 定义变量,还有let.const,定义变量. function getValue(condition){ console.log(typeof value2); // un ...
- ES6 let const 关键字
ECMAScript 和 JavaScript的关系? 前者是后者的规格,后者是前者的实现. 符合ECMAScript 规格的还有 Flash 中的AcionScript 和 TypeScript. ...
- Es6 之 const关键字
https://blog.csdn.net/jin_doudouer/article/details/80493649 es6中新增了一个const.就是用来定义一个常量的.以前其实一直没有把这个放在 ...
- ES6 let const关键字
在es6中,引入了let和const关键字: 1.letES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. (1)在块级作用域里有效(比 ...
- ES6新增const常量、let变量
JavaScript 严格模式(use strict) 严格模式下你不能使用未声明的变量. const c1 = 1; const c2 = {}; const c3 = []; 不能对c1的值进行再 ...
- [ES6] 22. Const
'const' keyword is for creating a read only variable, something you can never change once created. ' ...
- ES6中const、let与var的对比详解
对比 声明方式 变量提升 作用域 初始值 重复定义const 否 块级 需要 不允许let 否 块级 不需要 不允许var 是 函数级 不需要 允许 变量提升:const 和 l ...
随机推荐
- 剑指Offer-和为S的连续正数序列
题目: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他就 ...
- python 编码 自动加双斜杠问题
小编最近在进行utf-8转码的时候,遇到一个问题: 当其他编码中含有斜杆,如: 当取出该字符串时,会自动把斜杆转换成双斜杠 导致转码报错: 这时候可以在转码的时候加上,即可转换成功了 .decode( ...
- Hive 外部表的练习(多表关联查询,以及分组,子查询)
Hive 外部表的练习 hive创建库和表操作 hive加载数据,4种发放 1.数据放在Linux创建表结构 进行加载 2.先定义表结构.将一个查询select语句结果插入到表中 3.数据先放在hdf ...
- .net core 连接mysql
Package引入: mysql.data MySql.Data.EntityFrameworkCore Pomelo.EntityFrameworkCore.MySql 2. 在package ma ...
- 笔记《JavaScript 权威指南》(第6版) 分条知识点概要1—词法结构
[词法结构]字符集.注释.直接量.标识符和保留字.可选的分号 [字符集] JavaScript程序是用Unicode字符集编写的. Unicode是ASCII和Latin-1的超集,支持地球上几乎所有 ...
- TP5.0 Redis(单例模式)(原)
看到好多面试都问设计模式,我就简单的了解了一下,顺便把之前封装好的Reis做了一次修改. 单例模式(Singleton Pattern 单件模式或单元素模式) 单例模式确保某个类只有一个实例,而且自行 ...
- .NET Core和Swagger 生成 Api 文档转
阅读目录 1.引用 2.打开startup.cs文件 3.设置XML注释 4.运行结果 5.主要问题的解决办法 6.可以自定义UI 前言 最近写了好多Web api, 老大说太乱了,要整理一下,使用S ...
- mycat环境搭建
最近工作中突然让搞mycat,特意私下在家先搞一套练个手: 1.先下载一个CentOS7 mini版本就可以(本人机器性能有限): 2.使用VMware创建虚拟机,过程百度下一大堆,这里不做详细介绍. ...
- vsftpd详细配置
vsftpd配置文件详解 1.默认配置: 1>允许匿名用户和本地用户登陆. anonymous_enable=YES local_enable=YES 2>匿名用户使用的登陆名为ftp或a ...
- learning makefile foreach