当前位置: 首页 > news >正文

ES6 学习笔记(一)let,const和解构赋值

let和const

let和const是es6新增的两个变量声明关键字,与var的不同点在于:

(1)let和const都是块级作用域,在{}内有效,这点在for循环中非常有用,只在循环体内有效。var为函数作用域。

(2)使用let和const声明的变量,不存在变量提升,必须先声明再使用。使用var声明的变量可以先使用再定义。

(3)不可重复声明。一旦用var,let或者const声明过的变量,再次用let或者const声明时会报错,函数的参数名如果用let或者const在函数体内声明同名的参数时,也会报错。

const特殊要点:

(1)const顾名思义常量,但这个常量与高级语言的常量有所不同,这里的常量指的是在定义就确定其值,并且这个值只读,不可以修改;高级语言的常量更狭隘一点;

(2)使用const声明的变量,一旦声明需要立即初始化,只声明的变量无法用const,const a; 编译会报错;并且一旦初始化,就不能改变。

(3)const用于定义一个复合型对象或者数组时,只是对对象或者数组本身不可赋值,但依然可以为对象添加属性或者为数组push元素。

解构赋值

解构是按照一定的模式,从数组和对象中提取值,对变量进行赋值,解构表达式的左侧是一般[]或者{}。当解构表达式的左侧是[]时,右侧也必须是对应的具有可遍历属性的对象,因此可以是[],map或者string;当解构表达式的左侧为{}时,javascript解析器会先将右侧的值转换为对象,然后从转换的对象获取对应的属性值。总之,解构一个很重要的原则就是“模式匹配”,根据左侧是[]或者{},对右侧进行转换,如果转换后,两侧模式匹配,则进行解构赋值,否则报错。

同时,解构时允许设置默认值,但这里的执行顺序是:先解构,如果解构得到的值为非undefined,则变量值=解构的值,默认赋值表达式不执行;只有当解构得到的值严格等于undefined时,才会执行默认赋值表达式,否则默认赋值表达式是不执行的。

1.数组解构

数组的解构是按照变量的顺序进行赋值的,因此变量的值与数组的顺序息息相关,不同的顺序,解构得到的值也不同。

2.对象解构

对象解构与数组解构不同,对象解构与元素的顺序无关,对象解构的主要依据是对象的属性,对象的属性没有次序,变量必须与属性同名,才能取到正确的值。

3.函数参数解构

函数参数解构其实是数组解构或者对象解构的一种应用,在es6中可以为函数参数指定默认值,这点和解构一起使用,对于参数赋值非常实用。函数参数的解构同样要求模式匹配,函数定义时的参数的数据类型和调用时传入的参数类型保持一致。

另外:对于已经声明的变量进行解构赋值时,要非常小心。下面的示例中,首先用let对变量进行了声明,由于let和const声明的变量不能重复声明,在通过解构表达式赋值时,javascript解析器会将行首的{}解析为代码块,报语法错误。因此在行首加(),将其强制转化为表达式执行。

4.字符串的解构赋值

字符串也可以进行解构赋值,因为字符串可以转化为一个具有类似数组的对象。

5.数字和布尔值的解构赋值

解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。解构赋值的规则是,只要等号右边的值不是对象,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。

参考文献:http://es6.ruanyifeng.com/#do...

     http://es6.ruanyifeng.com/#do...

相关文章:

  • 「镁客·请讲」商询科技李劼:用MR拯救“垃圾大数据”,重构知识图谱是制胜关键...
  • 10个最佳ES6特性 ES7与ES8的特性
  • 你以为AI只能帮景区刷脸买票?其实它的用处还有很多
  • 230. Kth Smallest Element in a BST
  • vss使用笔记
  • 使用 Docker 部署 Spring Boot项目
  • luogu P1706全排列问题
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • git
  • Mysql数据库的条件查询语句
  • 观《时间的朋友2017》总结
  • Angry Birds和广告系统泄露个人信息——FireEye对Angry Birds的分析
  • Vagrant (二) - 日常操作
  • 2017年终总结、随想
  • js
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • js学习笔记
  • Object.assign方法不能实现深复制
  • Terraform入门 - 1. 安装Terraform
  • 阿里云购买磁盘后挂载
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 用element的upload组件实现多图片上传和压缩
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • ###C语言程序设计-----C语言学习(3)#
  • #Linux(make工具和makefile文件以及makefile语法)
  • #NOIP 2014#Day.2 T3 解方程
  • ( 10 )MySQL中的外键
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • ()、[]、{}、(())、[[]]命令替换
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (十五)使用Nexus创建Maven私服
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .skip() 和 .only() 的使用
  • @ComponentScan比较
  • @Conditional注解详解
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • []指针
  • [ANT] 项目中应用ANT
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解
  • [docker] Docker的私有仓库部署——Harbor
  • [HOW TO]怎么在iPhone程序中实现可多选可搜索按字母排序的联系人选择器
  • [HTTP]HTTP协议的状态码
  • [IT生活推荐]大家一起来玩游戏喽,来的都进!
  • [LeetCode] Contains Duplicate