先看let和var:

1.

console.log(a); // undefined
var a = 3;
console.log(a); // Uncaught ReferenceError: Cannot access 'a' before initialization
let a = 3;
 
在当前代码执行之前,首先会把所有带var关键字的进行声明(带function关键字的也会提前声明并且定义),即所谓的变量提升,let则不存在这种情况。
ps:项目中创建函数,一般都是基于函数表达式来实现,这样防止其提前变量提升,如:
 
let fn = function () {};

2.

var x = 3;
console.log(window.x); // let y = 3;
console.log(window.y); // undefined
 
用var进行全局变量声明的时候,也会给全局对象(浏览器中即window)增加一个对应的属性;但是用let声明的变量不存在这个特点。
仅限于全局变量创建时有这个特点,属于私有的执行上下文中创建的私有变量没有这个特点。
 
function fn() {
var x = 1;
y = 2;
console.log(fn.x); // undefined
console.log(fn.y); // undefined
}
fn();
console.log(window.x); // undefined
console.log(window.y); //

3.

var y = 21;
var y = 24;
console.log(y); //
console.log('OK'); // Uncaught SyntaxError: Identifier 'x' has already been declared
let x = 21;
console.log(x);
let x = 24;
console.log(x);
 
可以看到,用var声明同一个变量多次,前边声明的会被覆盖以最后一次赋值为准,而用let声明同一个变量多次时,并不是在let声明同一变量第二次时报错,浏览器显示在代码第一行就有报错。
因为一段代码在浏览器执行时,大体需要经过编译阶段和代码解析阶段,用var的可以重复声明,是因为在编译阶段中的词法解析阶段可以审核过,执行阶段遇到已经声明过的,不会再重新声明;但是用let的不可以,是因为在词法解析阶段都过不去,所以也就不存在引擎去执行代码的阶段了。

4.

if (1 === 1) {
let x = 3;
console.log(x);
}
console.log(x); // Uncaught ReferenceError: x is not defined
let a = 1;
switch (a) {
case 1:
let x = 2;
break;
}
console.log(x); // Uncaught ReferenceError: x is not defined
try {
let x = 100;
console.log(x); //
console.log(a);
} catch (e) {
let y = 200;
console.log(y); //
}
console.log(x);// Uncaught ReferenceError: x is not defined
try {
let x = 100;
console.log(x); //
console.log(a);
} catch (e) {
let y = 200;
console.log(y); //
}
console.log(y); // Uncaught ReferenceError: y is not defined

从上可以看出,let存在块级作用域,var则没有。

还有一个特殊的,暂时性死区:

console.log(typeof a); //=>undefined
console.log(typeof a); //=>Uncaught ReferenceError: Cannot access 'a' before initialization
let a;

再看let(var)和const

let x = 10;
x = 20;
console.log(x); //
const y = 10;
y = 20; // Uncaught TypeError: Assignment to constant variable.
console.log(y);
const obj = {a: 10};
obj.b = 20;
console.log(obj); // {a: 10, b: 20}
let创建的变量是可以更改指针指向的,也就是可以重新赋值的,但是const声明的变量是不允许改变指针指向的。
ps:之前有人说const创建的是常量,常量即不可更改,但从代码示例可以看出,const声明的基本类型值确实不允许改变,但若声明的是存储对象的地址指针,还是可以操作该对象的,像数字100这种才是真正的常量。

JS中let、var、const的区别的更多相关文章

  1. JavaScript中的var,const,let区别与用法(浅谈)

    let 和 const是(ES6) 新增加了两个重要的 JavaScript 关键字. 1.var全局变量 //全局变量在 JavaScript 程序的任何地方都可以访问 //定义的变量可以修改,如果 ...

  2. js中加“var”和不加“var”的区别

    JavaScript 拥有动态类型.这意味着相同的变量可用作不同的类型: var x // x 为 undefined var x = 6; // x 为数字 var x = "Bill&q ...

  3. JS 中的require 和 import 区别整理

    ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是CommonJS规范,使用require引入模块,使 ...

  4. JS中isPrototypeOf 和hasOwnProperty 的区别 ------- js使用in和hasOwnProperty获取对象属性的区别

    JS中isPrototypeOf 和hasOwnProperty 的区别 1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的 ...

  5. (网页)Angular.js 中 copy 赋值与 = 赋值 区别

    转自st.gg Angular.js 中 copy 赋值与 = 赋值 区别 为什么用 $scope.user = $scope.master; $scope.master 会跟着 $scope.use ...

  6. js中的substr和substring区别

    js中的substr和substring区别 Substring: 该方法可以有一个参数也可以有两个参数. (1)  一个参数: 示例: var str=“Olive”: str.substring( ...

  7. 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂

    浅谈JS中的!=.== .!==.===的用法和区别   var num = 1;     var str = '1';     var test = 1;     test == num  //tr ...

  8. JS中的var、let、const三者的区别

    ES5:var          ES6:let.const ES5中的作用域有---全局作用域.函数作用域 ES6中新增了---块级作用域(块级作用域由{}包裹,if语句.for语句中的{}也属于块 ...

  9. 浅谈js中null和undefined的区别

    在JS中,null和undefined是经常让人摸不着头脑的东西,尤其是在数据初始化以及处理的过程中,经常稍微不注意,就会让页面在渲染时出现报错,下面来细说下,这两者之间的区别: null 表示一个对 ...

  10. js中的call,apply,bind区别

    在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向. call.apply.bind方法的共同点和区别:app ...

随机推荐

  1. HashMap实现详解 基于JDK1.8

    HashMap实现详解 基于JDK1.8 1.数据结构 散列表:是一种根据关键码值(Key value)而直接进行访问的数据结构.采用链地址法处理冲突. HashMap采用Node<K,V> ...

  2. Kubernetes学习(一)

    一 安装 三台机器搭建K8S集群,一台master两台woker Docker 18.09.0---kubeadm-1.14.0-0 kubelet-1.14.0-0 kubectl-1.14.0-0 ...

  3. oracle问题之数据库恢复(三)

    可能很多人在做数据库恢复时,都遇到过如下错误: SQL> recover database; ORA: recovery session canceled due to errors ORA: ...

  4. 微信小程序框架分析小练手(二)——天气微信小程序制作

    简单的天气微信小程序. 一.首先,打开微信开发者工具,新建一个项目:weather.如下图: 二.进入app.json中,修改导航栏标题为“贵州天气网”. 三.进入index.wxml,进行当天天气情 ...

  5. nginx的进程结构实例演示

    nginx父子进程之间是使用信号进行管理的. nginx -s reload 会使之前的nginx子进程退出,生成新的nginx子进程 或者kill -SIGHUP 9170 kill -SIGTER ...

  6. ubuntu16.04+Opencv3.4.0安装(slam版)

    本文记录ubuntu下安装opencv过程,步骤来自 opencv官网可以对照官网步骤:https://docs.opencv.org/3.4.0/d7/d9f/tutorial_linux_inst ...

  7. 《Python学习手册 第五版》 -第2章 Python如何运行程序

    第二章主要讲解了Python的运行机制, 在开始之前,需要明确以下几点 因为<Python学习手册>这本书是面向市场很多人的,既然有很多人,就有很多不一样的需求和使用情况,这本书涵盖Pyt ...

  8. CAS 分析

    CAS是什么 (1) CAS(Compare and Swap) 比较并交换, 比较并交换是在多线程并发时用到的一种技术 (2) CAS是原子操作, 保证并发安全性, 而不是保证并发同步. (3) C ...

  9. 《 Java 编程思想》CH08 多态

    在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特征. 多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来. "封装"通过合并特征和行为来创建新的数据类 ...

  10. Coroutine 预激装饰器

    预激装饰器 讨论如何终止协程之前,我们要先谈谈如何启动协程.使用协程之前必须预激,可是这一 步容易忘记.为了避免忘记,可以在协程上使用一个特殊的装饰器.接下来介绍这样一个 装饰器. 预激协程的装饰器, ...