ES6(一)——字面量的增强、解构、let/const、块级作用域、暂时性死区

一、字面量的增强

ES6中对 对象字面量 进行了增强,称之为 Enhanced object literals(增强对象字面量)。

字面量的增强主要包括下面几部分:

  • 属性的简写:Property Shorthand
  • 方法的简写:Method Shorthand
  • 计算属性名:Computed Property Names
var name = "why"
var age = 18var obj = {// 1.property shorthand(属性的简写)name,age,// 2.method shorthand(方法的简写)foo: function() {console.log(this)},bar() {console.log(this)},baz: () => {console.log(this)},// 3.computed property name(计算属性名)[name + 123]: 'hehehehe'
}obj.baz()
obj.bar()
obj.foo()// obj[name + 123] = "hahaha"
console.log(obj)

二、解构Destructuring

ES6中新增了一个从数组或对象中方便获取数据的方法,称之为解构Destructuring。

我们可以划分为:数组的解构对象的解构

数组的解构:

  • 基本解构过程
  • 顺序解构
  • 解构出数组
  • 默认值
    在这里插入图片描述
    对象的解构:
  • 基本解构过程
  • 任意顺序
  • 重命名
  • 默认值
    在这里插入图片描述

三、解构的应用场景

解构目前在开发中使用是非常多的:

  • 比如在开发中拿到一个变量时,自动对其进行解构使用;
  • 比如对函数的参数进行解构;
    在这里插入图片描述

四、let/const基本使用

在ES5中我们声明变量都是使用的var关键字,从ES6开始新增了两个关键字可以声明变量:let、const
let、const在其他编程语言中都是有的,所以也并不是新鲜的关键字;但是let、const确实给JavaScript带来一些不一样的东西;

let关键字:

  • 从直观的角度来说,let和var是没有太大的区别的,都是用于声明一个变量

const关键字:

  • const关键字是constant的单词的缩写,表示常量、衡量的意思;

  • 它表示保存的数据一旦被赋值,就不能被修改;
    在这里插入图片描述

  • 但是如果赋值的是引用类型,那么可以通过引用找到对应的对象,修改对象的内容;
    在这里插入图片描述

注意:另外let、const不允许重复声明变量;
在这里插入图片描述

五、let/const作用域提升

let、const和var的另一个重要区别是作用域提升:

  • 我们知道var声明的变量是会进行作用域提升的;
  • 但是如果我们使用let声明的变量,在声明之前访问会报错;
    在这里插入图片描述
    那么是不是意味着foo变量只有在代码执行阶段才会创建的呢?
    答:不是。
    我们可以看一下ECMA262对let和const的描述;
  • 这些变量会被创建在包含他们的词法环境被实例化时,但是是不可以访问它们的,直到词法绑定被求值;
    在这里插入图片描述
    从上面我们可以看出,在执行上下文的词法环境创建出来的时候,变量事实上已经被创建了,只是这个变量是不能被访问的。
  • 那么变量已经有了,但是不能被访问,是不是一种作用域的提升呢?
  • 作用域提升:在声明变量的作用域中,如果这个变量可以在声明之前被访问,那么我们可以称之为作用域提升;
  • 在这里,它虽然被创建出来了,但是不能被访问, 所以可以认为let、const没有进行作用域提升,但是会在解析阶段被创建出来。

六、Window对象添加属性

我们知道,在全局通过var来声明一个变量,事实上会在window上添加一个属性:

  • 但是let、const是不会给window上添加任何属性的。

那么我们可能会想这个变量是保存在哪里呢?
答:变量被保存到VariableMap中
也就是说我们声明的变量和环境记录是被添加到变量环境中的:

  • 但是标准有没有规定这个对象是window对象或者其他对象呢?
  • 其实并没有,那么JS引擎在解析的时候,其实会有自己的实现;
  • 比如v8中其实是通过VariableMap的一个hashmap来实现变量的存储的
  • 那么window对象呢?而window对象是早期的GO对象,在最新的实现中其实是浏览器添加的全局对象,并且一直保持了window和var之间值的相等性;

七、var没有块级作用域

在我们前面的学习中,JavaScript只会形成两个作用域:全局作用域和函数作用域。
在这里插入图片描述
ES5中放到一个代码中定义的变量,外面是可以访问的:
在这里插入图片描述

八、let/const有块级作用域

在ES6中新增了块级作用域,并且通过let、const、function、class声明的标识符是具备块级作用域的限制的:

在这里插入图片描述

但是我们会发现函数拥有块级作用域,但是外面依然是可以访问的:

  • 这是因为引擎会对函数的声明进行特殊的处理,允许像var那样进行提升;

在这里插入图片描述

九、块级作用域的应用

我来看一个实际的案例:获取多个按钮监听点击:
在这里插入图片描述

在这里插入图片描述

十、暂时性死区

在ES6中,我们还有一个概念称之为暂时性死区:

  • 它表达的意思是在一个代码中,使用let、const声明的变量,在声明之前,变量都是不可以访问的
  • 我们将这种现象称之为 temporal dead zone(暂时性死区,TDZ);
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

十一、var、let、const的选择

那么在开发中,我们到底应该选择使用哪一种方式来定义我们的变量呢?

对于var的使用:

  • 我们需要明白一个事实,var所表现出来的特殊性:比如作用域提升、window全局对象、没有块级作用域等都是一些历史遗留问题;
  • 其实是JavaScript在设计之初的一种语言缺陷;
  • 当然目前市场上也在利用这种缺陷出一系列的面试题,来考察大家对JavaScript语言本身以及底层的理解;
  • 但是在实际工作中,我们可以使用最新的规范来编写,也就是不再使用var来定义变量了;

对于let、const:

  • 对于let和const来说,是目前开发中推荐使用的;
  • 我们会优先推荐使用const,这样可以保证数据的安全性不会被随意的篡改;
  • 只有当我们明确知道一个变量后续会需要被重新赋值时,这个时候再使用let;
  • 这种在很多其他语言里面也都是一种约定俗成的规范,尽量我们也遵守这种规范;

总结:
在这里插入图片描述

var: 有作用域提升,没有块级作用域,声明的变量可以重复定义
let、const: 没有作用域提升,有块级作用域,声明的变量不可以重复定义
在全局通过var来声明一个变量,会在window上添加一个属性,但是let、const是不会给window上添加任何属性的。

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

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

相关文章

MapReduce算法形式四:mapjoin

案例四:mapjoin(对个map共同输入,一个reduce) 这个方法主要解决的是,几个表之间的比较,类似于数据库的内外连接,还有一些左右连接之类的,简而言之就是,A表没有的B表有&am…

python开发出来的crm系统_用Python打造一个CRM系统(三)

在上一篇中我们基于cookiecutter-django创建了一个one_crm的项目,在本文中将在本地进行初始化,并成功运行起来。本地初始化之前先确保环境先安装了Python3.8、PostgreSQL,并创建了一个虚拟环境。1. 安装依赖库基于cookiecutter-django创建的项…

bzoj1053: [HAOI2007]反素数ant

51nod有一道类似的题。。。我至今仍然不会写暴搜&#xff01;&#xff01;&#xff01; #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define rep(i,s,t) for(int is;i<t;i) #define dwn(i,s…

ES6(二)——字符串模板、标签模板字符串、函数的默认参数、剩余参数、数组对象的展开语法、数值的表示、Symbol

一、字符串模板基本使用 在ES6之前&#xff0c;如果我们想要将字符串和一些动态的变量&#xff08;标识符&#xff09;拼接到一起&#xff0c;是非常麻烦和丑陋的&#xff08;ugly&#xff09;。 ES6允许我们使用字符串模板来嵌入JS的变量或者表达式来进行拼接&#xff1a; 首…

码云上传代码添加标签_eclipse上传代码到码云

本文将介绍如何将本地的项目提交到开源中国的码云上&#xff0c;提到码云大家是不是想到了咱们大佬“马云”&#xff1f;呵呵&#xff0c;这个也挺强大的不过不是一个人而是一个版本控制器。改教程讲解过程比较详细&#xff0c;跟着做实现起来很简单。由于自己本身也是一个新手…

codeforce gym 100548H The Problem to Make You Happy

题意&#xff1a; Alice和Bob在一个有向图上玩游戏&#xff0c;每个人各自操作一个棋子&#xff0c;如果两个棋子走到一个点上&#xff0c;判定Bob输&#xff1b;如果轮到任何一方走时&#xff0c;无法移动棋子&#xff0c;判定该方输 现在Bob先走&#xff0c;要求判断胜负 题解…

ES6(三)——Set、WeakSet、Map、WeakMap

一、Set的基本使用 在ES6之前&#xff0c;我们存储数据的结构主要有两种&#xff1a;数组、对象。 在ES6中新增了另外两种数据结构&#xff1a;Set、Map&#xff0c;以及它们的另外形式WeakSet、WeakMap。 Set是一个新增的数据结构&#xff0c;可以用来保存数据&#xff0c;类…

git gui怎么拉取项目代码_Git可视化极简易教程 — Git GUI使用方法

前言之前一直想一篇这样的东西&#xff0c;因为最初接触时&#xff0c;我也认真看了廖雪峰的教程&#xff0c;但是似乎我觉得讲得有点多&#xff0c;而且还是会给我带来很多多余且重复的操作负担&#xff0c;所以我希望能压缩一下它在我工作中的成本&#xff0c;但是搜索了一下…

POJ分类-转载

转载过来&#xff0c;慢慢刷 初期:一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj3295) (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法: (1)图的深度优先…

smzdm 扫地机器人_堪称米家最值!米家系列扫地机器人选购须知

堪称米家最值&#xff01;米家系列扫地机器人选购须知2018-05-14 17:34:44102点赞354收藏81评论本篇内容来自#全民分享季#第三季活动&#xff0c;本周选题#分享你的生活记录#&#xff0c;共同瓜分5000金币&#xff01;拿紫米移动电源&#xff0c;抽取最新款iPad&#xff01;快来…

ES6~ES12——Array Includes、Object values、Object entries、Object fromEntries、flat、flatMap、空值合并运算符、可选链等

一、ES7 - Array Includes 在ES7之前&#xff0c;如果我们想判断一个数组中是否包含某个元素&#xff0c;需要通过 indexOf 获取结果&#xff0c;并且判断是否为 -1。 在ES7中&#xff0c;我们可以通过includes来判断一个数组中是否包含一个指定的元素&#xff0c;根据情况&…

移除通知的时机

链接 结论 最好是在不需要的时候就移除掉。 如果不是特别苛刻&#xff0c;可以直接在dealloc函数里写。因为dealloc函数一定会被调用的。 在dealloc函数中移除的可能问题 由于dealloc在Runloop结束时会被调用。如果在Runloop调用之前&#xff0c;又有一个通知到来&#xff0c;会…

谷歌浏览器有哪些好看的主题_Kibou 简洁的Typecho主题

一款基于 Bootstrap 的单栏的简洁的自适应Typecho主题。这是一款开发于17年的Typecho主题,如果您喜欢简洁的单栏主题&#xff0c;那么这款主题会是您不错的选择Kibou 是一款基于 Bootstrap 的单栏的简洁的自适应Typecho主题。这是一款开发于17年的Typecho主题,如果您喜欢简洁的…

JS高级——Proxy、Reflect

一、监听对象的操作 我们先来看一个需求&#xff1a;有一个对象&#xff0c;我们希望监听这个对象中的属性被设置或获取的过程 通过我们前面所学的知识&#xff0c;能不能做到这一点呢&#xff1f;其实是可以的&#xff0c;我们可以通过之前的属性描述符中的存储属性描述符来…

python为什么不会溢出_深入分析python中整型不会溢出问题

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

Promise学习笔记

一、异步任务的处理 这里我从一个实际的例子来作为切入点&#xff1a; 我们调用一个函数&#xff0c;这个函数中发送网络请求&#xff08;我们可以用定时器来模拟&#xff09;&#xff1b;如果发送网络请求成功了&#xff0c;那么告知调用者发送成功&#xff0c;并且将相关数…

实验代做 行人识别_实验室代做实验项目

实验室代做实验项目一、分子生物学检测服务1、 引物设计合成(人、大鼠、小鼠、兔等)2、 基因表达水平检测、内参检测3、 SNP检测服务4、 甲基化检测服务5、 测序技术服务6、 芯片检测(全基因、MicroRNA)7、 染色体分析二、病理形态学检测1、 HE、特殊染色(PAS、MASSON等)2、 电…

Java学习笔记之:Java引用数据类型之字符串

一、简介 字符串广泛应用在Java编程中&#xff0c;在Java中字符串属于对象&#xff0c;Java提供了String类来创建和操作字符串。 创建字符串最简单的方式如下: String greeting "Hello world!"; 在代码中遇到字符串常量时&#xff0c;这里的值是"Hello world!&…

JS高级——Iterator迭代器、Generator生成器

一、什么是迭代器&#xff1f; 在JavaScript中&#xff0c;迭代器也是一个具体的对象&#xff0c;这个对象需要符合迭代器协议&#xff08;iterator protocol&#xff09;&#xff1a; 迭代器协议定义了产生一系列值&#xff08;无论是有限还是无限个&#xff09;的标准方式&…

删除一行下方单元格上移_快速删除Excel工作表多余空单元格

从其他地方复制了数据&#xff0c;有时候会出现多余的空单元格。手动删除很麻烦&#xff0c;就像下面的图中的工作表区域。下面介绍一种方法&#xff0c;可以快速删除多余空单元格。1.选中目标区域&#xff0c;在这里就选中A1:A9的单元格区域。2.按键盘上的F5或者CtrlG。3.点击…