深入浅析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 相关文章推荐
js继承的实现代码
Aug 05 Javascript
jQuery 名称冲突的解决方法
Apr 08 Javascript
javascript表单验证 - Parsley.js使用和配置
Jan 25 Javascript
基于Javascript实现二级联动菜单效果
Mar 04 Javascript
12个非常实用的JavaScript小技巧【推荐】
May 18 Javascript
javascript insertAfter()定义与用法示例
Jul 25 Javascript
功能强大的Bootstrap组件(结合js)
Aug 03 Javascript
浅析BootStrap Treeview的简单使用
Oct 12 Javascript
微信小程序实现锚点定位楼层跳跃的实例
May 18 Javascript
js中数组对象去重的两种方法
Jan 18 Javascript
微信小程序配置服务器提示验证token失败的解决方法
Apr 03 Javascript
node.js开发辅助工具nodemon安装与配置详解
Feb 06 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(1)
2006/10/09 PHP
PHP UTF8中文字符截断函数代码
2012/09/11 PHP
mysqli_set_charset和SET NAMES使用抉择及优劣分析
2013/01/13 PHP
php简单判断两个字符串是否相等的方法
2015/07/13 PHP
ThinkPHP 3.2.2实现事务操作的方法
2017/05/05 PHP
PHP多进程之pcntl_fork的实例详解
2017/10/15 PHP
PHP反射实际应用示例
2019/04/03 PHP
laravel框架的安装与路由实例分析
2019/10/11 PHP
Javascript实现的分页函数
2006/12/22 Javascript
JavaScript 学习点滴记录
2009/04/24 Javascript
Jquery 的扩展方法总结
2011/10/01 Javascript
js隐藏与显示回到顶部按钮及window.onscroll事件应用
2013/01/25 Javascript
js阻止冒泡及jquery阻止事件冒泡示例介绍
2013/11/19 Javascript
jquery如何实现锚点链接之间的平滑滚动
2013/12/02 Javascript
jquery+ajax实现跨域请求的方法
2015/01/20 Javascript
浅析JavaScript函数的调用模式
2016/08/10 Javascript
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
2016/12/15 Javascript
js实现3D图片环展示效果
2017/03/09 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
javascript计算对象长度的方法
2017/10/25 Javascript
vue实现弹幕功能
2019/10/25 Javascript
[00:57]英雄,你的补给到了!
2020/11/13 DOTA
记录Django开发心得
2014/07/16 Python
python输出指定月份日历的方法
2015/04/23 Python
python实现用户登陆邮件通知的方法
2015/07/09 Python
Python实现Event回调机制的方法
2019/02/13 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
2019/07/06 Python
使用pandas库对csv文件进行筛选保存
2020/05/25 Python
Chinti & Parker官网:奢华羊绒女装和创新针织设计
2021/01/01 全球购物
《记承天寺夜游》教学反思
2014/02/16 职场文书
注册资产评估专业求职信
2014/07/16 职场文书
博士导师推荐信
2015/03/25 职场文书
公司2015年终工作总结
2015/05/26 职场文书
工资证明格式模板
2015/06/12 职场文书
德能勤绩工作总结
2015/08/11 职场文书
Android Rxjava3 使用场景详解
2022/04/07 Java/Android