let和const

发布自Kindem的博客,欢迎大家转载,但是要注意注明出处。另外,该文章收纳在Kindem的个人的 IT 知识整理仓库,欢迎 Star、Fork、投稿

let

let是在ES6加入的新的变量声明方法,let声明变量的方法和var类似:

let a = 'hello';
var b = 'hello';
复制代码

let的功能是声明一个作用域被限制在块级的变量,而var声明的变量的作用域只能是全局的或者整个函数块的

function varTest() {var x = 1;if (true) {var x = 2;// 2console.log(x);}// 2console.log(x);
}function letTest() {let x = 1;if (true) {let x = 2;// 2console.log(x);}// 1console.log(x);
}
复制代码

再举一个例子:

var a = 1;
var b = 2;if (a === 1) {var a = 11;let b = 22;// 11console.log(a);// 22console.log(b);
}// 11
console.log(a);
// 2
console.log(b);
复制代码

另外,如果作用域位于程序的顶层,var会挂载到window上,而let不会:

var a = 'a';
let b = 'b';// this -> window
// a
console.log(this.a);
// undefined
console.log(this.b);
// a
console.log(window.a);
// undefined
console.log(window.b);
复制代码

在相同的函数或块作用域内重新声明同一个变量会引发一个重复定义的SyntaxError

if (x) {let foo;// SyntaxErrorlet foo;
}
复制代码

letvar都会在声明所在的作用域顶部被创建,这被称为变量提升,但是不同的是var的创建会伴随着一个undefined值,在赋值之后才会改变,而let没有被赋值之前是不会被初始化的,如果在这期间引用let声明的变量,会导致一个ReferenceError,直到初始化之前,该变量都处于暂存死区:

function test() {// undefinedconsole.log(bar);// ReferenceErrorconsole.log(foo);var bar = 1;let foo = 2;
}
test();
复制代码

两个复杂一点的例子:

function test(){var foo = 33;if (true) {// ReferenceErrorlet foo = (foo + 55);}
}
test();
复制代码
function go(n) {// Object {a: [1,2,3]}console.log(n);// ReferenceErrorfor (let n of n.a) {console.log(n);}
}
go({a: [1, 2, 3]});
复制代码

const

const的基本作用是声明一个作用域被限制在块级的常量,其作用域和let一样,基本使用也和let类似,但是const的特点是const声明的值一经创建无法被改变

使用const会创建一个值的只读引用,这意味着const声明的对象本省的引用是无法被改变的,但是其属性是可以被改变的,因为改变其属性并不会引起其引用的变化

下面给出const的一些特性的例子:

基本使用:

const a = 'abc';
复制代码

无法被重复定义:

const a = 'abc';
// SyntaxError: Identifier 'a' has already been declared
const a = 'abc';
复制代码

声明时就必须赋值:

// SyntaxError: Missing initializer in const declaration
const a;
复制代码

无法被修改:

const a = 'a';
// TypeError: Assignment to constant variable
a = 'b';
复制代码

块级作用域:

if (true) {var a = 'a';const b = 'b';// aconsole.log(a);// bconsole.log(b);
}
// a
console.log(a);
// ReferenceError: not defined
console.log(b);
复制代码

作用域在程序顶层时不会挂在window对象上:

var a = 'a';
const b = 'b';// this -> window
// a
console.log(this.a);
// undefined
console.log(this.b);
// a
console.log(window.a);
// undefined
console.log(window.b);
复制代码

转载于:https://juejin.im/post/5b991742f265da0abe26e4bd

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GIT 操作笔记

设置不用每次都输入 账号密码 git config --global credential.helper store然后,下次再输入一次 账号密码 就可以了。删除github上的文件$ git pull origin master 将远程仓库里面的项目拉下来$ dir 查看有哪些文件夹$ git rm -r --cached target 删除target文件…

[book]道法自然

前不久读了王咏刚的〈凌波微步〉和〈凌波微步II〉,感觉不错。今天把他老人家的《道法自然》也买了下来。在dearbook看到关于这本书的长篇大评,也一块copy了下来:http://www.dearbook.com.cn/book/viewbook.aspx?pnoTS0023954认真的作者&…

c语言编手机蓝牙软件的代码,51单片机C语言的简易蓝牙锁代码

#include#define uint unsigned int#define uchar unsigned charuchar r_buf; //蓝牙接收到的字符存储缓冲区sbit PWMAP2^0; //电机驱动模块接口sbit IN1P2^2;sbit IN2P2^1;sbit STBYP2^3;sbit LED1P0^0; //LED灯接口sbit LED2P0^1;sbit LED3P0^2;sbit key1P1^0;…

列表嵌套字典,根据字典某一key排序

在返回列表嵌套字典时候,往往需要对数据进行一定的处理:按照字典中某一个key排序 In [87]: a [{"name": "牛郎", "age": 23},{"name":"许仙", "age": 20},{"name":"董永&q…

display: inline-block 布局

三个元素display: inline-block; 布局 ,其中一个元素中存在其他元素也用了display: inline-block; 无法垂直居中,将这个元素设置为display: inline; 转载于:https://www.cnblogs.com/Running00/p/11163751.html

GCC精彩之旅

在为Linux开发应用程序时,绝大多数情况下使用的都是C语言,因此几乎每一位Linux程序员面临的首要问题都是如何灵活运用C编译器。目前 Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSI…

写出C语言中5种数据类型的名称及其关键字,求C语言中的32个关键字及其意思?...

关键字如下:一、数据类型关键字(12个):(1) char :声明字符型变量或函数(2) double :声明双精度变量或函数(3) enum :声明枚举类型(4) float:声明浮点型变量或函数(5) int: 声明整型变量或函数(6…

想要设计自己的微服务?看这篇文章就对了

欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 本文由我就静静地看 发表于云社区专栏 本文通过使用Spring Boot,Spring Cloud和Docker构建的概念验证应用程序的示例,为了解常见的微服务架构模式提供了一个起点。 该代码在Github上…

函数的嵌套调用

在函数的内部调用其他的函数 def index(): func() print("index") def func(): index() # def index():# func()# print("index")## def func():# print("func")# index()#def my_max(x,y): #这个函数的作用就是比大小谁大打印出…

mysql 开发进阶篇系列 41 mysql日志之慢查询日志

一.概述 慢查询日志记录了所有的超过sql语句( 超时参数long_query_time单位 秒),获得表锁定的时间不算作执行时间。慢日志默认写入到参数datadir(数据目录)指定的路径下。默认文件名是[hostname]_slow.log,默认超时是10秒,默认不开…

分数相同名次排名规则C语言,如何给数据排名(相同分数相同名次)-excel篇

使用Rank函数来做数据排名该函数是返回一个数值在一个数字列表中的排名。语法:RANK(number,ref,order)RANK(对象,范围,参数)number(必填参数):是特定单位格中的数据,需要在整个数字列表中排名的单个对象。ref(必填参数):是指需要排名的整体数列。即范围&…

子窗体列表在菜单中的实现

想在菜单中加入子窗体的列表,上网找了半天,都很麻烦,后来看看了菜单的属性,发现里面有个MdiList属性,设置成true,搞定,晕。 转载于:https://www.cnblogs.com/catzhou/articles/258450.html

MySql的连接查询

若一个查询同时涉及到两个或者两个以上的表,则称之为连接查询。常见的包括:等值连接查询,自然连接查询,非等值连接查询,自身连接查询,外连接查询(左右连接)。 1.等值与非等值连接查询…

linux下ssh通过公钥登录服务器

经常会通过ssh登录远程服务器,一种是通过密码方式登录,一种是通过公钥登录。 如何设置通过公钥登录服务器 1. 首先生成自己的公钥和私钥 ssh-keygen 命令用来生成公钥和私钥-t 用来指定密钥类型(dsa | ecdsa | ed25519 | rsa | rsa1&#xff…

qt运行C语言后无显示,qt designer启动后不显示界面问题的原因与解决办法-站长资讯中心...

Qt 5.6.1无论是在vs里双击ui文件还是直接启动designer.exe都一直无法显示界面,但任务管理器中可以看到该进程是存在的。前几天还正常的,但昨天加了一块NVIDIA的显卡(机器自带核显),可能与此有关。幸好还可以通过QtCreator打开ui文件进行编辑。…

OpenSolaris北京用户组的第一次活动

OpenSolaris北京用户组的第一次活动作者: BadcoffeeEmail: blog.olivergmail.comBlog: http://blog.csdn.net/yayong2005年10月10月15号,OpenSolaris北京用户组在北京西郊宾馆会议厅组织了成立以来的第一次活动。尽管OpenSolaris早在2005年6月14日就正式开放源代码&…

. SQL多条件查询存储过程

编辑器加SQL多条件查询存储过程 2010-05-13 17:06:29| 分类: SQL | 标签: |字号大中小 订阅 . 例一、 ALTER proc SelectProduct ProdID varchar(10), ProdName nvarchar(30), CategoryID varchar(5), MinPrice decimal(10,2), MaxPrice decimal(10,2) a…

矩阵转置c语言的思路,矩阵转置 (C语言代码)

解题思路:注意事项:参考代码:#includeint main(){int n,s[100][100];void transposition(int(*p)[100], int n);scanf("%d", &n);for (int i 0; i < n; i){for (int j 0; j < n; j)scanf("%d", *(s i) j);}transposition(s, n);return 0;}vo…

Android PermissionUtils:运行时权限工具类及申请权限的正确姿势

Android PermissionUtils&#xff1a;运行时权限工具类及申请权限的正确姿势 ifadai 关注 2017.06.16 16:22* 字数 318 阅读 3637评论 1喜欢 6PermissionUtil 经常写Android运行时权限申请代码&#xff0c;每次都是复制过来之后&#xff0c;改一下权限字符串就用&#xff0c;把…

实现带下拉菜单的工具栏按钮

在工具栏中使用真彩色图标 实现带下拉菜单的工具栏按钮 20050916转载于:https://www.cnblogs.com/henryzc/archive/2005/11/08/271346.html