ES6中var/let/const的区别
let的含义及let与var的区别:
let 声明的变量只在它所在的代码块有效;
如下:
- for (let i = 0; i < 10; i++) {
- console.log(i);
- }
- console.log('aaa');
- console.log(i); // i is not defined
上面代码中,计数器i只在for循环体内有效,在循环体外引用就会报错。如下var代码:
- var a = [];
- for (var i = 0; i < 10; i++) {
- a[i] = function() {
- console.log(i);
- }
- }
- a[6](); // 10
变量i是var声明的,在全局范围内都有效,所以每一次循环,新的i值都会覆盖旧值,导致最后输出的是最后一轮i的值。
但是如果使用let,声明的变量仅在块级作用域内有效,最后输出的是6. 如下:
- var b = [];
- for (let j = 0; j < 10; j++) {
- b[j] = function() {
- console.log(j);
- }
- }
- b[6](); // 6
不存在变量提升
let 不像var 那样会发生 ‘变量提升’ 现象,因此,变量需要先声明然后再使用,否则报错;
- // var 的情况
- console.log(foo); // undefined
- var foo = 2;
- // let的情况;
- console.log(bar); // 报错
- let bar = 2;
暂时性死区
快级作用域内存在let命令,它所声明的变量就绑定在这个区域,不再受外部影响;如下代码:
- var tmp = 123;
- if (true) {
- tmp = 'abc';
- let tmp;
- console.log(tmp); // tmp is not defined
- }
上面代码定于全局变量tmp,但是在快级作用域内let又声明了一个局部变量tmp,导致绑定了这个快级作用域;因此打印出tmp会报错。
不允许重复声明
let 不允许在相同作用域内,重复声明同一个变量。如下代码排错
- function a() {
- let a = 10;
- var a = 1;
- console.log(a);
- }
- a();
- function a() {
- let a1 = 10;
- let a1 = 1;
- console.log(a1);
- }
- a();
也不能在函数内部重新声明参数。
- function func1(arg) {
- let arg; // 报错
- }
- function func2(arg) {
- {
- let arg; // 不报错
- }
- }
ES6的块级作用域
- function f1() {
- let n = 5;
- if (true) {
- let n = 10;
- }
- console.log(n); // 5
- }
- f1()
上面的代码有2个代码块,都声明了变量n,运行后输出5,说明了外层代码块不受内层代码块的影响,如果使用了变量var,那么输出的就是10;
const命令
const 声明一个只读的常量,一旦声明,常量的值就不允许改变。
如下代码:
- const a = 1;
- a = 2;
- console.log(a); //报错
也就是说 const 一旦声明了变量,就必须初始化,不能留到以后赋值。如果使用const声明一个变量,但是不赋值,也会报错;如下代码:
- const aa; // 报错
const的作用域与let命令相同;只在声明所在的块级作用域内有效。
- if (true) {
- const aa = 1;
- }
- console.log(aa); // 报错
不可重复声明 (和let一样)
- var message = "Hello!";
- let age = 25;
- // 以下两行都会报错
- const message = "Goodbye!";
- const age = 30;
但是对于复合类型的变量,比如数组,存储的是一个地址,不可改变的是这个地址,即不能把一个地址指向另一个地址,但是对象本身是可变的,比如可以给它添加新的属性;如下代码:
- const a33 = [];
- a33.push('Hello'); // 可执行
- a33.length = 0; // 可执行
- a33 = ['55'] // 报错
ES6中var/let/const的区别的更多相关文章
- es6中 var 和 let的区别
区别1:var没有块级作用域,只有 函数级作用域 和 全局作用域:let有块级作用域 function fn() { { var a = 10; } console.log(a) //输出10 } f ...
- 【ES6 】var/let/const的区别
var 声明变量 没有区级作用域 可以预解析 可以重复定义 声明的全局变量属于顶层对象(window)的属性 let 声明变量 有块级作用域 没有预解析 不可以重复定义 声明的全局变量不属于顶层对象( ...
- Es6中let与const的区别:(神奇的块级作用域)
所谓的块级作用域:形成一个暂时性的死区:{ } 一.共同点: a:都是用来声明变量: b:都能形成一个块级作用域: c:都只能在声明变量的块级作用域里面有效: 二.不同点: 1.let: a:在 ...
- 【前端面试】(四)JavaScript var let const的区别
视频链接: JavaScript var let const的区别 - Web前端工程师面试题讲解 参考链接: JavaScript 变量 JavaScript Let JavaScript Cons ...
- 浅谈JS中 var let const 变量声明
浅谈JS中 var let const 变量声明 用var来声明变量会出现的问题: 1. 允许重复的变量声明:导致数据被覆盖 2. 变量提升:怪异的数据访问.闭包问题 3. 全局变量挂载到全局对象:全 ...
- var let const 的区别
Var let const 的区别 1.Var 定义的变量存在变量提升,而了let和const不存在变量提升.即在定义的变量代码上使用该变量,var的会输出undefined,而let的会报错. 2. ...
- javascript中var let const三种变量声明方式
javascript中var let const三种变量声明方式 1.var ①var表示声明了一个变量,并且可以同时初始化该变量. ②使用var语句声明的变量的作用域是当前执行位置的上下文:一个函 ...
- ES6中let、const和var的区别
一.let 1.基本用法 ES6 新增了let命令,用来声明变量. let 的用法类似于 var,但所声明的变量只在 let 命令所在的代码块内有效(一个“{}”相当于一个代码块) { let a = ...
- js中定义变量之②var let const的区别
var 上一篇文章有讲过,是js定义变量的关键词. 但是在es6中,新添加了两个关键词,用于变量声明的关键词:let 和const 接下来就说一下var let 和const的区别: 首先说var 用 ...
随机推荐
- 单元测试系列之十:Sonar 常用代码规则整理(二)
摘要:帮助公司部署了一套sonar平台,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分析,避免再次出现类似问题. 作者原创技术文章,转载请注明出处 ======== ...
- LINQ更新提示找不到行或行已更改的解决一例
LINQ对一行数据进行更改,怎么都无法提交,所有字段值都不是空值,后来看了实体,我发现更改的数据是主键,去数据库看这个字段却不是主键,原来是数据库取消主键了,实体代码没取消,因为更改了主键,所以无法更 ...
- 【新特性】JDK1.9
一.目录结构 JDK9具体目录结构如下所示: bin: 该目录包含所有的命令. conf: 包含用户可以编辑的配置文件,例如以前位于jre\lib 目录中的.properties 和 .policy ...
- deep learning入门:感知机
权重和偏置 import numpy as np # 求x1 and x2 def AND(x1, x2): x = np.array([x1, x2]) w = np.array([0.5, 0.5 ...
- ComponentOne 2019V1:全面支持 Visual Studio 2019
ComponentOne Enterprise 2019V1已经正式发布,本次更新的最大亮点就是 ComponentOne 控件全面支持 Visual Studio 2019. 作为一款专注于企业应用 ...
- centOS 及 ubuntu 下载地址记录
CentOS下载地址: http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1611.iso : ubu ...
- js随机数的取整
- 找出 Xcode 编译C/C++过程文件及生成文件
在使用 Xcode 编写C/C++时,会发现在项目的目录位置是没有编译过程的那些 .o .exe 文件,只有一个 C/C++ 源代码 .c 文件.如下图(在Mac OS的finder中右键窗口标题名称 ...
- If嵌套
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- node使用ftp模块获取文件夹信息,中文乱码问题
c.on('ready', function () { c.list(function (err, list) { if (err) throw err list.map(item => { i ...