ES6 新增了let命令,用来声明变量,新增了const命令,用来声明常量,它们的用法类似于var

let a = 1;
var b = 2;
const PI = 3.14;

主要区别

块级作用域

let声明的变量和const声明的常量有块级作用域,var声明的变量则只有函数作用域

{let a = 1;const PI = 3.14;var b = 2;
}
console.log(a);     //报错
console.log(PI);    //报错
console.log(b);     //2
function fun(){let a = 1;const PI = 3.14;var b = 2;
}
console.log(a);     //报错
console.log(PI);    //报错
console.log(b);     //报错

不存在变量提升

var声明的变量存在变量提升,即变量可以在声明之前使用,值为undefinedlet声明的变量和const声明的常量不存在变量提升,

console.log(b);  //undefined
var b = 2;console.log(a);  //报错
let a = 1;console.log(PI); //报错
const PI = 3.14;

不能重复声明

letconst不允许在相同作用域内,重复声明同一个变量,var则可以。

{let a = 1;let a = 2;          //报错
}
{let a = 1;var a = 2;          //报错
}
{let a = 1;const a = 2;        //报错
}
{var a = 1;const a = 2;        //报错
}
{var a = 1;var a = 2;          //不报错
}

暂时性死区

在代码块内,使用let命令声明变量(或者const声明常量)之前,该变量(常量)都是不可用的,这种情况称为“暂时性死区”。

var a = 1;
{console.log(a);        //报错let a = 1;
}
var PI = 3;
{console.log(PI);   //报错const PI = 3.14;
}

其他区别

在全局作用域下用var声明的常量会作为window对象的属性保存,letconst不会。

var a = 1;
let b = 2;
const PI = 3.14;console.log(window.a);     //1
console.log(window.b);      //undefined
console.log(window.PI);     //undefined

const声明的常量在声明的时候必须赋值,letvar可以只声明不赋值,此时变量的值为undefined

var a;
let b;
const PI;           //报错console.log(a);     //undefined
console.log(b);     //undefined

const声明的常量在声明后就不能被修改。

const PI = 3.14;
PI = 3.1415;       //报错

const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据,值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据,变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此const如果声明的是复合类型数据,则可以修改其属性。

const PERSON = {name : "XD"
};PERSON.name = "JH";
console.log(PERSON.name);       //"JH"

可以使用Object.freeze(obj)方法将对象冻结。

const PERSON = Object.freeze({name : "XD"
});
PERSON.name = "JH";      //常规模式时,该行不起作用;严格模式下会报错。

除了将对象本身冻结,对象的属性如果也指向一个对象,那么这个对象也应该冻结。下面是一个将对象彻底冻结的函数。

var constantize = function(obj){Object.freeze(obj);Object.keys(obj).forEach(function(key , i){if(typeof obj[key] === 'object'){constantize(obj[key]);}});
};

ES6——let、const和var的用法和区别相关推荐

  1. js中const,var,let的区别

    1.const 定义的变量不可以被修改,而且必须初始化. const b = 2;//正确// const b;//错误,必须初始化 console.log('函数外const定义b:' + b);/ ...

  2. C# const与readonly的用法和区别解析(转)

    总结一下const和readonly: 1.const和readonly的值一旦初始化则都不再可以改写: 2.const只能在声明时初始化:readonly既可以在声明时初始化也可以在构造器中初始化: ...

  3. C++ const 和 constexpr 的用法和区别

    const 和 constexpr 用法 const用法 语义 const 是一个限定符 ,用 const 定义的变量被视为常量,const 对象一旦创建其值就不能再改变.除非用于定义类成员,否则 c ...

  4. let、const和var的区别(涉及块级作用域)

    let .const和var的区别 let.const.var在js中都是用于声明变量的,在没有进行ES6的学习前,我基本只会使用到var关键字进行变量的声明,但在了解了ES6之后就涉及到了块级作用域 ...

  5. uniapp 获取到js文件var一个变量怎么获取到这个变量值_浅析Js中const,let,var的区别及作用域...

    理解:let变量的作用域只能在当前函数中 js中const,let,var的区别及作用域_lianzhang861的博客-CSDN博客​blog.csdn.net 全局作用域中,用 const 和 l ...

  6. JavaScript let、const与var的区别

    ES5中的var是没有块级作用域的(if/for) ES5中的let是有块级作用域的(if/for) ES5之前因为if和for都没有块级作用域的概念,所以在很多时候,我们都必须借助于function ...

  7. JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别

    JavaScript:学习笔记(7)--VAR.LET.CONST三种变量声明的区别 ES2015(ES6)带来了许多闪亮的新功能,自2017年以来,许多JavaScript开发人员已经熟悉并开始使用 ...

  8. 犀牛书第七版学习笔记:let、const和 var 声明与赋值

    目录 0.基本常识 0.1变量与常量 0.2 作用域scope 0.3 重复声明 1.var 1.1 var声明作用域 var Declaration Scope 函数作用域 全局var声明 1.2 ...

  9. 前端进阶之 let、const、var

    作者:陈大鱼头 github: KRISACHAN 链接:github.com/YvetteLau/S- 背景:最近高级前端工程师 刘小夕 在 github 上开了个每个工作日布一个前端相关题的 re ...

最新文章

  1. 设计聊天机器人技术栈的终极攻略
  2. java选择循环_java选择和循环结构
  3. git push -u origin master和git push 远程主机名 本地分支名:远程分支名作用
  4. 3-6:类与对象下篇——构造函数中的初始化列表、匿名对象和explicit关键字
  5. 微软BI 之SSRS 系列 - 解决Pie Chart 中控制标签外部显示与标签重叠的问题
  6. 2021年基金什么时候布局?
  7. 苹果手机如何调节屏幕彩色(对于百度提供的方式行不通时此方法必有用)
  8. c语言递归函数奇偶归一猜想,计算机科学视角下的奇偶归一猜想
  9. ugmented reality(AR) equipment
  10. JavaSE环境搭建
  11. 子母钟时钟系统工业应用
  12. U8常用的二次开发方式
  13. PHP获取服务器图片并添加水印
  14. 主动雷达和被动雷达的区别
  15. 切线和倒数_原函数的导数和反函数的导数为什么是倒数关系
  16. noip 2009 靶形数独
  17. 关于最近GD32F103替代STM32F103方案个人记录
  18. 计算机的组成:硬件和软件
  19. 国外免费网管软件推荐
  20. 通过Exiv2读取照片的Exif信息获取GPS,焦距等信息

热门文章

  1. HTTPS-使用Fiddler抓取HTTPS数据包原理
  2. linux下限制ip访问
  3. Web应用工作原理、动态网页技术
  4. WebSphere MQ 安装
  5. 30天敏捷结果(15):让自己处于宁静状态
  6. 说说中国的图书出版业者-读《小学奥数举一反三(5年级A版)》和《2010注册建筑师建筑结构考试强化模拟试题集》有感...
  7. C程序设计语言现代方法01:C语言概述
  8. 【GPORF源码编译】GDB源码编译之gprof交叉编译
  9. 【汇编优化】之MIPS架构优化
  10. cad图形文件无效且无法修复_20个CAD技巧,47个常用快捷键,助你高效出图,从此不加班!...