深入浅析var,let,const的异同点


Posted in Javascript onAugust 07, 2018

一、let和var区别

1.关于变量提升,var能变量提升,let不能

// 关于var 如下所示
console.log(a); //输出undefined,此时就是变量提升
var a = 2;  
console.log(a); //2

//相当于下面的代码
var a; //声明且初始化为undefined
console.log(a); //输出undefined
a=2;    //赋值
console.log(a); //2

// 关于let 如下所示
console.log(a); // 报错ReferenceError
let a = 2;
//相当于在第一行先声明a但没有初始化,直到赋值时才初始化

//直接用let声明变量不赋值是会打印undefined,这时候初始化了
let a;
console.log(a);//值为undefined

2.暂时性死区:块级作用域内存在let命令,它所声明的变量就“绑定”这个区域,不再受外部的影响重点内容,简而言之,就是某个代码块有let指令,即使外部有名称相同的变量,该代码块的同名变量与外部的变量也互不干扰。而var不会,如下所示:

//let
var a = 123;
if (true) {
 let a="abc";
 console.log(a); //输出abc 
}
console.log(a);  //输出值为123,全局a与局部a互不影响

//var
var a = 123;
if (true) {
 var a="abc";
 console.log(a); //输出abc 
}
console.log(a);  //输出值为abc,全局的已被改变

总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。例子如下:

var tmp=1;
if (true) {
 // TDZ开始
 tmp = 'abc'; // ReferenceError
 console.log(tmp); // ReferenceError

 let tmp; // TDZ结束
 console.log(tmp); // undefined

 tmp = 123;
 console.log(tmp); // 123
}
console.log(tmp); //

3.let声明绑定的代码块内,不能重复声明同一个变量,var可以

//a不能重复声明
function sub() {
 let a = 10;
 var a = 1;
}  //报错,Identifier 'a' has already been declared

function sub() {
 let a = 10;
 let a = 1;
}  //同上

function sub() {
 let a = 10;
 {let a = 1;} //此时不在同一个代码块,不会报错
} 

//var可以重复声明,不会报错
function sub() {
 var a = 10;
 var a = 1;
}

4.类似for循环的代码块,let只在代码块内部有效,var在代码块外部也有效

//let只在代码块内部有效
for (let i = 0; i < 10; i++) {}
console.log(i); //报错ReferenceError: i is not defined

//var在代码块外部也有效
for (let i = 0; i < 10; i++) {}
console.log(i); //101

let在for循环内特别之处:就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。
//只在父作用域
var a = [];
for (let i = 0; i < 10; i++) {
 a[i] = function () {
  console.log(i);
 };
}
a[6](); // 6

//子作用域重新声明
var a = [];
for (let i = 0; i < 10; i++) {
 a[i] = function () {
   let i=3; //重新赋值
   console.log(i);
 };
}
a[6](); // 3 ,取得新的值

二、let和const

1、相同点:

A、变量不提升。
B、暂时性死区,只能在声明的位置后面使用。
C、不可重复声明。

2、不同点:

let声明的变量可以改变。
const声明一个只读的常量。一旦声明,常量的值就不能改变,且声明的时候必须初始化赋值。
let a;  //undefined
const b;//报错,声明的时候必须赋值

let a=1;
a=2;    //可改变

const b=1;
b=2;    //报错,不能改变值

//一些自己觉得要注意的点
let a=null;         //a=null
a=undefined;    //a=undefined
a=2;            //a=2
const a=null;   //a=null,const也可以定义null和undefined
const b=undefined;   //b=undefined
b=2;            //报错,不能改变值

本质:

const实际上保证的,并不是变量的不得改动,而是变量指向的那个内存地址所保存的数据不得改动。

A、五种基本数据类型(Number,String,Boolean,Undefined,Null):值就保存在变量指向的那个内存地址,等同于常量。不能改变值。

B、复杂数据类型(Object:数组、对象):该类型变量名不指向数据,而是指向数据所在的地址,const只保证变量名指向的地址不变,并不保证改地址的数据不变,因此可以对该地址的属性值进行修改,但是不能改变地址指向。

const a=[];
a.push("Hello"); //可执行,改地址的属性值可以修改
a.length=0;   //可执行,同上
a=["Tom"];   //报错,不能改变地址指向

const b ={};
b.prop=123;   //为b添加一个属性,可以成功
b.prop    //123
b={};    //将b指向另外一个地址,就会报错

如果真的想将对象冻结,应该使用Object.freeze方法。
const b=Object.freeze({});
// 常规模式时,下面一行不起作用,b.prop为undefined
// 严格模式时,该行会报错
b.prop = 123;

总结

以上所述是小编给大家介绍的var,let,const的异同点,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
基于jQuery的输入框无值自动显示指定数据的实现代码
Jan 24 Javascript
jQuery随便控制任意div隐藏的方法
Jun 28 Javascript
JS实现可拖曳、可关闭的弹窗效果
Sep 26 Javascript
javascript点击按钮实现隐藏显示切换效果
Feb 03 Javascript
JavaScript实现九九乘法表的简单实例
Jun 07 Javascript
微信小程序 解决swiper不显示图片的方法
Jan 04 Javascript
js实现无缝滚动图
Feb 22 Javascript
js实现图片旋转 js滚动鼠标中间对图片放大缩小
Jul 05 Javascript
简单实现js放大镜效果
Jul 24 Javascript
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
Nov 09 Javascript
Vue用v-for给src属性赋值的方法
Mar 03 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
Aug 27 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
Aug 07 #Javascript
JS实现中英文混合文字溢出友好截取功能
Aug 06 #Javascript
JS实现图片上传多次上传同一张不生效的处理方法
Aug 06 #Javascript
JS插件clipboard.js实现一键复制粘贴功能
Dec 04 #Javascript
js实现图片上传并预览功能
Aug 06 #Javascript
JS解析后台返回的JSON格式数据实例
Aug 06 #Javascript
微信小程序网络封装(简单高效)
Aug 06 #Javascript
You might like
php中支持多种编码的中文字符串截取函数!
2007/03/20 PHP
Php Cookie的一个使用注意点
2008/11/08 PHP
laravel5.1 ajax post 传值_token示例
2019/10/24 PHP
js 操作符实例代码
2009/10/24 Javascript
jquery图片不完全按比例自动缩小的简单代码
2013/07/29 Javascript
浏览器的JavaScript引擎的识别方法
2013/10/20 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
jquery删除数据记录时的弹出提示效果
2014/05/06 Javascript
jQuery.extend 函数及用法详细
2015/09/06 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
如何解决vue与传统jquery插件冲突
2017/03/20 Javascript
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
2017/06/04 Javascript
基于模板引擎Jade的应用(详解)
2017/12/12 Javascript
animate.css在vue项目中的使用教程
2018/08/05 Javascript
linux服务器快速卸载安装node环境(简单上手)
2021/02/22 Javascript
[00:55]2015国际邀请赛中国区预选赛5月23日——28日约战上海
2015/05/25 DOTA
[01:21]DOTA2周边文化主题展 神秘商店火热开售
2017/07/30 DOTA
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
python获得文件创建时间和修改时间的方法
2015/06/30 Python
运用TensorFlow进行简单实现线性回归、梯度下降示例
2018/03/05 Python
numpy.std() 计算矩阵标准差的方法
2018/07/11 Python
python的几种矩阵相乘的公式详解
2019/07/10 Python
Python matplotlib绘制饼状图功能示例
2019/09/10 Python
如何利用python web框架做文件流下载的实现示例
2020/06/02 Python
Python return语句如何实现结果返回调用
2020/10/15 Python
css3实现六边形边框的实例代码
2019/05/24 HTML / CSS
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
美国最大的万圣节服装网站:HalloweenCostumes.com
2017/10/12 全球购物
屈臣氏官方旗舰店:亚洲享负盛名的保健及美妆零售商
2019/03/15 全球购物
学生党员的自我评价范文
2014/03/01 职场文书
土地转让协议书
2014/04/15 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
护理工作个人总结
2015/03/03 职场文书
干部作风纪律整顿心得体会
2016/01/23 职场文书
python基础详解之if循环语句
2021/04/24 Python
windows11怎么查看wifi密码? win11查看wifi密码的技巧
2021/11/21 数码科技