ES6入门(一)
ES6入门 (一)
let 和 const 命令
- 定义:let 和 const 都是ES6 当中声明变量的
关键字
let
定义
let 用法与var 相似
注意事项
块级作用域
我们使用let 会创建一个块级作用域,这个变量只能在这个块级作用域当中使用。那么问题来了,什么是块级作用域呢?在我们学习js的时候相信大家都知道什么是 局部作用域
什么是 全局作用域
。下面我们例子说明一下
<script>
let a = 5; //当我们在全局范围内声明一个变量的时候,这个变量的块级作用域就是全局作用域
function fn1(){
let b = 10 //当我们在局部范围内声明一个变量,他的块级作用域就是局部作用域
}
</script>
- ES5当中 内存变量可能会覆盖外层变量
var a = 'abc';
function f() {
// 函数内部变量提升 相当于 var a 的声明
console.log(a);
if(false) {
var a = 'hello,world'
}
}
f() // undefined
上面代码的原意是,if
代码块的外部使用外层的tmp
变量,内部使用内层的tmp
变量。但是,函数f
执行后,输出结果为undefined
,原因在于变量提升,导致内层的tmp
变量覆盖了外层的tmp
变量。
- 用来计数的循环变量泄露成全局变量
var s = 'hello';
for(var i=0;i<s.length;i++){
console.log(s[i])
}
console.log(i) //5
- ES5中 函数只能在顶层的作用域和函数作用域之中声明,不能在块级作用域当中声明。而ES6当中
允许
在块级作用域之中声明函数。但是函数声明语句的行为类似于let
,在块级作用域之外不可引用
不存在变量提升
如果你已经学过 js 并且有一定的js 基础 那么你对 变量提升
一定不陌生。我们都知道如果按正常逻辑,我们必须声明一个变量,然后才应该可以使用他,而变量提升就可以让我们在声明变量之前就使用这个变量(只是不会报错)
变量提升简单来说:就是在js 代码解析的过程当中 我们会把所有的声明的变量提升到这个变量所在作用域的第一行,也就是说我们在给变量赋值之前使用变量的时候不会报错,因为变量提升让变量的声明体现到了代码解析的最前面。
而我们使用let 声明变量的时候,不存在变量提升。也就是说我们在声明这个变量之前不可以使用这个变量否则就会报错
// 变量提升 相当于 var a 提前声明了一个变量 只有经历赋值操作才可以有值
console.log(a) // undefined
var a = 2
console.log(a) // 2
console.log(b) // 报错
let b = 2
console.log(b) // 2
let的特点就是存在暂时性死区
只要块级作用域内存在 let
命令,它所声明的变量就 “绑定” (binding)
这个区域,不再受外部的影响。
var a = 10;
if (true) {
a = 5; // ReferenceError
let a;
}
在这个代码中, 存在一个全变量 a
, 但是在 if
块级作用域内又声明了一个局部变量a,导致局部变量a被绑定在这个块级作用域,所以在let
声明变量前,使用这个局部变量都会报错。
ES6 明确规定,如果区块中存在let
和const
命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
总之,在代码块内,使用let
命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)
if(true) {
a = 'abc'; // ReferenceError
console.log(a) // ReferenceError
let a ; //遇到了变量的声明 暂时性死区结束
console.log(a) //已经遇到了变量的声明,这个时候打印他 a的值是 undefined
a = 123;
console.log(a) // 结果 123
}
特殊情况的暂时性死区 之 ES6函数存在默认值情况
function fn1(x=y,y=2) {
return [x,y]
}
fn1() //报错
如果你是初次介绍es6 我可以简单给你先介绍一下es6中函数存在默认值的情况。函数的默认值呢,是在我们使用函数并且没有给函数传递实参的时候,这时他的参数的值就等于我们给这个参数设置的默认值
在上述代码中 参数x
默认值等于另一个参数 y
但是在这个时候 y
还没有声明,属于 暂时性死区。
function fn1(x=2,y=5) {
return [x,y]
}
fn1() // //[2,5] 因为我们没有给这个函数传递实参 所以参数的默认值就起了作用
fn1(3) // [3,5]
fn1(3,4) //[3,4]
默认参数的作用域
一旦设置了参数的默认值,函数进行声明初始化的时候,参数会形成一个单独的作用域。等到初始化结束,这个作用域就会消失 。
var x = 1;
function f(x,y=x) {
console.log(y)
}
f(2) // 2
在上述代码当中,参数y
的默认值等于变量x
。调用这个函数的时候,参数形成了一个单独的作用域 ,在这个作用域里面,函数的一个参数指向的是调用这个函数传递的实参2
let x = 2
function f1(y=x){
let x = 3;
console.log(y)
}
f1() // 2
在上述代码中同样涉及到一个高级概念 作用域链
。与上面例子一样,调用这个函数的时候y=x 形成了一个单独的作用域他是局部作用域,因为在这里x的值不存在,所以根据作用域链,他会向上一层作用域寻找x直到找到他 所以这个例子中 参数y的默认值x 是全局作用域当中声明的变量x
不允许重复声明变量
function fn2() {
let a = 10;
let a = 1; // 报错
}
fn2()
function fn3(x) {
let x;
}
fn3() // 报错
function fn4(x) {
{
let x ;
}
}
fn4() // 不报错
const 关键字
定义:
const
声明一个只读的常量。一旦声明,常量的值就不能改变。
注意事项
const
命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。
const命令的本质
const
实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const
只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。
const foo = {};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only
ES6入门(一)的更多相关文章
- ES6入门笔记
ES6入门笔记 02 Let&Const.md 增加了块级作用域. 常量 避免了变量提升 03 变量的解构赋值.md var [a, b, c] = [1, 2, 3]; var [[a,d] ...
- es6入门4--promise详解
可以说每个前端开发者都无法避免解决异步问题,尤其是当处理了某个异步调用A后,又要紧接着处理其它逻辑,而最直观的做法就是通过回调函数(当然事件派发也可以)处理,比如: 请求A(function (请求响 ...
- es6入门3--箭头函数与形参等属性的拓展
对函数拓展兴趣更大一点,优先看,前面字符串后面再说,那些API居多,会使用能记住部分就好. 一.函数参数可以使用默认值 1.默认值生效条件 在变量的解构赋值就提到了,函数参数可以使用默认值了.正常我们 ...
- Vue+koa2开发一款全栈小程序(1.课程介绍+2.ES6入门)
1.课程介绍 1.课程概述 1.做什么? Vue+koa2开发一款全栈小程序 2.哪些功能? 个人中心.图书列表.图书详情.图书评论.个人评论列表 3.技术栈 小程序.Vue.js.koa2.koa- ...
- es6入门5--class类的基本用法
在ES6之前,准确来说JavaScript语言并无类的概念,却有模拟类的做法.相比在类似java这类传统面向对象语言中通过类来生成实例,js则通过构造函数模拟类来生成实例. 这是因为在JS设计初期,作 ...
- es6入门6--数组拓展运算符,Array.from()基本用法
本文只是作为ES6入门第九章学习笔记,在整理知识点的同时,会加入部分个人思考与解答,若想知道更详细的介绍,还请阅读阮一峰大神的ES6入门 一.拓展运算符 ES6中新增了拓展运算(...)三个点,它的作 ...
- ES6入门之let和const命令
前言 大家好,我是一只流浪的kk,当你看到这边博客的时候,说明你已经进入了ES6学习的领域了,从本篇博客开始,我将会将自己学习到ES6的相关知识进行整理,方便大家参考和学习,那么我将带你进入第一节的内 ...
- ES6入门之变量的解构赋值(二)
前言 在上一章 ES6入门之let和const命令中我们对ES6的相关语法已经有了初步了解,上一章中我们主要学习了三大部分的内容,let命令的使用,块级作用域,const命令的使用,那么从本篇博客将进 ...
- ES6入门十二:Module(模块化)
webpack4打包配置babel7转码ES6 Module语法与API的使用 import() Module加载实现原理 Commonjs规范的模块与ES6模块的差异 ES6模块与Nodejs模块相 ...
- es6入门7--Set Map数据结构
本文作为ES6入门第十三章的学习整理笔记,可能会包含少部分个人的理解推测,若想阅读更详细的介绍,还请阅读原文ES6入门 一.set数据结构 1.set不接受重复值 ES6新增了Set构造函数用于创建s ...
随机推荐
- Android拍照相关知识总结
1.调用系统的照相机程序 Intent intent = newIntent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(inte ...
- Koa源码解析,带你实现一个迷你版的Koa
前言 本文是我在阅读 Koa 源码后,并实现迷你版 Koa 的过程.如果你使用过 Koa 但不知道内部的原理,我想这篇文章应该能够帮助到你,实现一个迷你版的 Koa 不会很难. 本文会循序渐进的解析内 ...
- 如何修改npm仓库地址
解决方案 npm config set registry http://registry.npm.taobao.org/ 将npm默认设置为淘宝镜像地址 发布包 当你想发布自己的包时,需要将地址修改回 ...
- git环境配置 | GitHub
注册完GitHub之后,需要配置git,其主要的目的是为了方便文件的上传.下载等. 一. git下载 https://git-scm.com/downloads 在git官网找到相应版本的git下载安 ...
- 为什么要使用Mybatis-现有持久化技术的对比
1)JDBC SQL 夹在Java代码块里,耦合度高导致硬编码内伤 维护不易且实际开发需求中SQL有变化,频繁修改的情况很多 2)Hibernate 和 JPA 长难复杂SQL, 对于Hibernat ...
- 设计模式系列之工厂模式三兄弟(Factory Pattern)
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- python第三方库大全
环境管理 管理 Python 版本和环境的工具 p:非常简单的交互式 python 版本管理工具.官网 pyenv:简单的 Python 版本管理工具.官网 Vex:可以在虚拟环境中执行命令.官网 v ...
- 授权函数-web_set_user
为Web服务器指定登录字符串.当我们使用RNS服务器或者某些服务器的时候需要我们输入账号密码登录才能给进行访问,那么这个时候就需要用到该函数 int web_set_user(const char* ...
- 手写简易版Promise
实现一个简易版 Promise 在完成符合 Promise/A+ 规范的代码之前,我们可以先来实现一个简易版 Promise,因为在面试中,如果你能实现出一个简易版的 Promise 基本可以过关了. ...
- Java中在数字前自动补零方法
/** * 数字前面自动补零 * @param number 数字 * @return */ public static String geFourNumber(int number){ Number ...