当前位置: 首页 > news >正文

了解一下ES6: let const

写之前翻了翻掘金的let & const系列文章,写的人很多。搞得我不想去做重复运动了。但是大部分都写的很难懂。今天我们来写一篇易懂的


ES6系列文章标准开头:

  


emm......错了错了,应该是下面这张图片



var和let的区别

在之前,我们常常用var去声明一个变量。但是var本身就有一些问题:

在var的概念里,没有块级作用域

此话怎讲?

我们首先来上这样一段代码:

if (true) {
    var a = "hello";
}
console.log(a);复制代码

输出结果:a

但是我们换成let尝试一下:

if (true) {
    let a = "hello";
}
console.log(a);复制代码

输出:ReferenceError: a is not defined

也就是a 变量为定义


在let类型内,形成了块级作用域的概念,我们在if内定义的let类型变量,在if外层是无法进行访问的。会提示变量未被定义


有个典型的例子,就是块级作用域导致的问题 

for (var a = 0; a < 3; a++) { // 结果输出为 3 3 3
    setTimeout(() => {
        console.log(a)
    }, 1000)
}

for (let a = 0; a < 3; a++) { // 结果输出为 0 1 2
    setTimeout(() => {
        console.log(a)
    }, 1000)
}复制代码



var类型可以重复声明

在之前,我们一个变量名,用var类型可以声明两次。示例:

var a = 10;
var a = 20;复制代码


但是let不可以,重复声明会报错。提示:已声明标识符'a'

SyntaxError: Identifier 'a' has already been declared 


var类型可以进行变量提升

首先,我们先要明白什么是变量提升

变量提升的概念就是,函数及变量的声明都将被提升到函数的最顶部。实例:

console.log(vara); //undefined
var vara = 20;
console.log(vara); //20复制代码

在使用var时,会将变量提升在函数最顶部,但只是声明未赋值。之后运行到声明的行时,再进行赋值。所以我们为何可以看到 undefined


但是let就不是这样了。我们换成let试试

ReferenceError: vara is not defined
复制代码

这里直接提示 vara变量 未被声明。

也就是代表,let不支持变量预解释,也不支持变量提升。



const

const是ES6中一个新引入的类型,学过C++的可能很熟悉。他代表声明一个常量

既然是常量,那肯定代表初始化值后无法重新赋值了。例如

const a = 1;
a = 2;复制代码

TypeError: Assignment to constant variable.复制代码

会提示:赋值给常量变量报错


但是,我们就无法更改const类型的常量了吗?

有一种是比较特殊的,那就是对象(Object)。如果我们声明一个对象常量,那么对象内属性的值还是可以更改的

const info = {
    name: '王圣松',
    age: 17
};
info.name = "Janlay";
console.log(info);复制代码

然后输出 

{ name: 'Janlay', age: 17 }
复制代码


当然,在每一个闭包内还是可以重复声明的。Tips: 在ES6中,闭包的写法也更新了

以前的写法

;(function () {

})();
复制代码

现在

{
}复制代码

所以,我们这样写:

const name = "王圣松";
{
    const name = "wss";
    console.log(name)
}
{
    const name = "wss";
    console.log(name)
}
console.log(name);复制代码

然后输出:

wss
wss
王圣松复制代码



The End

Babel中文网


相关文章:

  • 【斗医】【12】Web应用开发20天
  • WCF和IIS宿主的ASP.NET 共享会话
  • ORDER BY,GROUP BY 和DI STI NCT 优化
  • JS中字符串转义
  • 【SSH网上商城项目实战03】使用EasyUI搭建后台页面框架
  • ORA-00119: invalid specification for system parameter LOCAL_LISTENER;
  • Mybatis介绍
  • USB数据采集卡:labjack T7、T7 Pro系列的技术特点
  • Mocha测试初探
  • 在线修改ha.proxy配置文件
  • BZOJ 4016: [FJOI2014]最短路径树问题
  • Flask的sqlalchemy SQL练习
  • js通过按钮直接把input或者textarea里的值复制到粘贴板里
  • SpringBoot基础篇配置信息之多环境配置信息
  • Horizon for NSX 服务安装包
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 230. Kth Smallest Element in a BST
  • 30天自制操作系统-2
  • Android单元测试 - 几个重要问题
  • HTTP 简介
  • MySQL数据库运维之数据恢复
  • nginx 配置多 域名 + 多 https
  • Object.assign方法不能实现深复制
  • text-decoration与color属性
  • vue 配置sass、scss全局变量
  • 从tcpdump抓包看TCP/IP协议
  • 反思总结然后整装待发
  • 近期前端发展计划
  • 精彩代码 vue.js
  • 蓝海存储开关机注意事项总结
  • 前端js -- this指向总结。
  • 在electron中实现跨域请求,无需更改服务器端设置
  • ​马来语翻译中文去哪比较好?
  • ​虚拟化系列介绍(十)
  • #AngularJS#$sce.trustAsResourceUrl
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (39)STM32——FLASH闪存
  • (BFS)hdoj2377-Bus Pass
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (转)负载均衡,回话保持,cookie
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET MVC第五章、模型绑定获取表单数据
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .Net中ListT 泛型转成DataTable、DataSet
  • @Autowired @Resource @Qualifier的区别
  • [BZOJ 3680]吊打XXX(模拟退火)
  • [CSDN首发]鱿鱼游戏的具体玩法详细介绍
  • [hadoop读书笔记] 第十五章 sqoop1.4.6小实验 - 将mysq数据导入HBASE