前言
在一个项目中,我们会声明很多的变量来存储数据,我们可以把变量当作一个盒子,盒子的名称就是变量名,盒子盛放的东西就是变量的值。
在JavaScript
中,我们可以使用var
,let
,const
等关键字声明一个变量,如:
var a;//声明一个叫a的盒子
a = 1;//将数值1放进这个盒子里面
//或者
var a = 1;
let b = 2;
const c = 3;
var、let与const之间的区别
在前面的例子,我们分别使用了var
,let
,const
声明了变量,那么使用这三个关键词声明的变量有什么不同呢?下面我们一起来看一下。
var
使用var
声明变量,相当于声明一个全局变量,我们知道在浏览器中,window
是全局对象,所以全局变量是window
对象的属性,因此使用var
声明变量,相当于往window
对象声明一个属性。
var a = 10;
console.log(window.a == a);//输出true
没有块级作用域
块级作用域是ES6才有概念,在ES5中,只有全局作用域和函数作用域,因此使用var
声明的变量,如果不是在函数内声明,则为全局变量,如果在函数内声明,则为函数内部的局部变量。
{
var a = 1;//全局变量
let b = 2;//只在当前作用域有效
}
console.log(a);//输出1
console.log(b);//报错:b is not defined
变量提升
console.log(a)
var a = 1;
上面的例子中,最后输出的值为1
,这是因为变量提升
,所谓变量提升,是指使用var声明变量时,无论在哪里声明,在解析脚本时,会把所有声明变量的语句一行行先执行,所上面的代码执行顺序是这样的:
var a = 1;
console.log(a)
允许重复声明
使用var
可以重复声明变量,因此下面的语句,在JavaSciprt是允许的:
var a = 1;
var b = 2;
let
let
是ES6
新增的用于代替var
关键字,使用let
声明的变量,有以下几个特征:
-
变量不能在声明前使用 -
变量声明后不能再次声明 -
不存在变量提升 -
变量可以有块级作用域
let a = 1;
let a = 2;//再次声明,报错
console.log(b);//在声明之前使用,报错
let b = 2;
{
let c = 3;//只在当前作用域有效
}
console.log(c);//读取一个未声明的变量,报错
const
const
用于声明一个常量,所谓常量,即声明的变量时必须赋值,且在之后使用过程不能重新赋值。
const a = 1;
const a = 2;//重复声明,报错
a = 2;//重新声明,报错
const b;//没有赋初始值,报错
与let一样,const声明的变量,也不存在变量提升,且只在声明后才生效,如果存在块级作用域,在作用域之外则无法读取该变量的值。
另外,前面我们说const声明的变量不允许重新赋值,但如果使用const声明一个对象或数组等引用类型常量,虽然同样无法重新给该常量赋值,但却可以修改对象的属性和数组的元素,如:
const a = {x:1,y:2}
a.name = 'test'//给对象添加一个属性,可以执行
a = {name:'test'}//重新赋值,报错
const a = [];
a.push('6666'); // 给数组添加一个元素,可以执行
a.length = 0; // 重置数组的长度,
a = ['test']; // 重新赋值,报错
小结
通过上面几个简单的例子与对比,我们发现,由于历史原因,var
声明变量存在许多奇奇怪怪的问题,因为在ES6
中引入let
和const
来声明变量,而let
和const
声明的变量可有自己的块级作用域,这也有助于程序的模块化。
原文始发于微信公众号(程序员读书):JavaScript的let,var,const声明变量的区别
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/39081.html