了解 ES6 的变量特性:Var、Let、Const

一、Var

在没出现 let 和 const 之前,我们定义变量只能用 var。但是用 var 定义变量通常有很多的问题,就是我们常说的变量提升,例如:

javascript 复制代码
if (false) {
  var a = 1;
}
console.log(a);

如果初学者第一次看这段代码的时候,肯定会觉得段代码会报错,因为 if 中的条件是 false,并没有执行 var a = 1,所以最后应该报 a 没有定义的错误,但是实际最后却输出了 undefined,这就是变量提升。

什么是变量提升 : MDN 是这么说的:变量提升(Hoisting)被认为是, Javascript 中执行上下文 (特别是创建和执行阶段)工作方式的一种认识。在 ECMAScript® 2015 Language Specification 之前的 JavaScript 文档中找不到变量提升(Hoisting)这个词。不过,需要注意的是,开始时,这个概念可能比较难理解,甚至恼人。 这就没了?对这就没了!当看到的时候同样有这个疑问,所以我在var 描述中找到了这么一句话:变量声明,无论发生在何处,都在执行任何代码之前进行处理。 所以以上代码可以被翻译成这样:

复制代码
var a;
if (false) {
  a = 1;
}
console.log(a);

二、Let

我们先看一下 let 的几大特性:

1、没有声明提升

我们通过代码来看一下:

复制代码
if (false) {
  let a = 1;
}
console.log(a);

fileOf7256.png

执行结果

欣喜若狂终于得到了我们想要的结果,报错,a 没有被定义。

2、重复声明报错

复制代码
var a = 1;
let a = 2;

fileOf7256.png

执行结果

哇塞,报错了,显示 a 已经被定义过了,这简直是太友好了,终于不会一不小心就改变了全局变量,也终于避免了重复命名的危险。

3、不绑定全局作用域

复制代码
let a = 1;
console.log(window.a); // undefined

根本没有定义到全局上,主要还是因为 let 是块级作用域不是全局作用域。

三、Const

在开发中 const 我们一般是来定义常量,即不可更改的量,它的基本特性和 let 是差不多的。

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

执行上述代码时,会报错,因为 const 定义的是常量,无法进行修改。但是当 const 定义的是引用数据类型时:

复制代码
const a = {
  value: 1,
};
a.value = 2;
console.log(a); // {value: 2}

确实如此,这是因为 const 定义的实际是引用地址,它判断是的引用地址是否发生变化,虽然改变了引用数据中的数据,但是它的引用地址并没有发生变化,所以就可以更改,但是这种方式还是不提倡的。

相关推荐
骑自行车的码农21 小时前
🍂 React DOM树的构建原理和算法
javascript·算法·react.js
北极糊的狐21 小时前
Vue3 中父子组件传参是组件通信的核心场景,需遵循「父传子靠 Props,子传父靠自定义事件」的原则,以下是资料总结
前端·javascript·vue.js
20岁30年经验的码农1 天前
Java Elasticsearch 实战指南
java·开发语言·elasticsearch
雾岛听蓝1 天前
C++ 类和对象(一):从概念到实践,吃透类的核心基础
开发语言·c++·经验分享·笔记
CoderYanger1 天前
优选算法-优先级队列(堆):75.数据流中的第K大元素
java·开发语言·算法·leetcode·职场和发展·1024程序员节
TracyCoder1231 天前
MySQL 实战宝典(八):Java后端MySQL分库分表工具解析与选型秘籍
java·开发语言·mysql
非凡的世界1 天前
为什么我和越来越多的PHP程序员,选择了 Webman ?
开发语言·php·workman·webman
看到我请叫我铁锤1 天前
vue3中THINGJS初始化步骤
前端·javascript·vue.js·3d
q***25211 天前
SpringMVC 请求参数接收
前端·javascript·算法
MarkHD1 天前
车辆TBOX科普 第45次
java·开发语言