深入浅析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 相关文章推荐
javascript函数库-集合框架
Apr 27 Javascript
理解Javascript_02_理解undefined和null
Oct 11 Javascript
jquery div拖动效果示例代码
Dec 08 Javascript
使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)
Jun 05 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
Jul 18 Javascript
简单实现bootstrap导航效果
Feb 07 Javascript
vue 2.0组件与v-model详解
Mar 27 Javascript
详解React 16 中的异常处理
Jul 28 Javascript
Bootstrap图片轮播效果详解
Oct 17 Javascript
把vue-router和express项目部署到服务器的方法
Feb 21 Javascript
微信小程序云开发之数据库操作
May 18 Javascript
详解从vue-loader源码分析CSS Scoped的实现
Sep 23 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 XML操作类DOMDocument
2009/12/16 PHP
基于asp+ajax和数据库驱动的二级联动菜单
2010/05/06 PHP
PHP在特殊字符前加斜杠的实现代码
2011/07/17 PHP
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
2011/08/02 PHP
php页码形式分页函数支持静态化地址及ajax分页
2014/03/28 PHP
ucenter通信原理分析
2015/01/09 PHP
php实现遍历文件夹的方法汇总
2017/03/02 PHP
浅析PHP7 的垃圾回收机制
2019/09/06 PHP
jQuery库与其他JS库冲突的解决办法
2010/02/07 Javascript
基于jquery的checkbox下拉框插件代码
2010/06/25 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
2011/10/21 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
2015/03/04 Javascript
JavaScript图片轮播代码分享
2015/07/31 Javascript
关于Vue.js 2.0的Vuex 2.0 你需要更新的知识库
2016/11/30 Javascript
js实现彩色条纹滚动条效果
2017/03/15 Javascript
实例详解JavaScript中setTimeout函数的执行顺序
2017/07/12 Javascript
Vue.js划分组件的方法
2017/10/29 Javascript
微信小程序tabBar模板用法实例分析【附demo源码下载】
2017/11/28 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
Vue 换肤的示例实践
2018/01/23 Javascript
详解vue服务端渲染浏览器端缓存(keep-alive)
2018/10/12 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
2019/06/12 Javascript
[06:07]DOTA2-DPC中国联赛 正赛 Ehome vs VG 选手采访
2021/03/11 DOTA
Python3安装Pymongo详细步骤
2017/05/26 Python
pycharm+django创建一个搜索网页实例代码
2018/01/24 Python
Python list列表中删除多个重复元素操作示例
2019/02/27 Python
使用Python做垃圾分类的原理及实例代码附源码
2019/07/02 Python
python内存动态分配过程详解
2019/07/15 Python
查看端口并杀进程python脚本代码
2019/12/17 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
解决HTML5中滚动到底部的事件问题
2019/08/22 HTML / CSS
大学生个人简历中的自我评价
2013/12/27 职场文书
人事行政经理岗位职责
2014/06/18 职场文书
2014年学生会个人工作总结
2014/11/07 职场文书
清洁员岗位职责
2015/02/15 职场文书
ORACLE查看当前账号的相关信息
2021/06/18 Oracle