前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >小结ES6基本知识点(一)

小结ES6基本知识点(一)

原创
作者头像
前端林子
修改于 2019-02-24 04:20:45
修改于 2019-02-24 04:20:45
2.9K00
代码可运行
举报
文章被收录于专栏:前端技术总结前端技术总结
运行总次数:0
代码可运行

0,本文适合人群和主要内容

ES6初学者,通过阅读本文可对ES6知识点有个大体的概念,强烈建议阅读阮一峰大大的ES6入门

老司机可以直接绕路。

主要内容

  • let、const命令
  • 解构赋值
  • 箭头函数
  • 字符串的一些扩展
  • 数组方法:map、filter、reduce
  • Module
  • Class
  • Set和Map
  • Promise
  • async和await

1.let、const

(1)let所声明的变量,只在使用let所在的代码块内有效,在代码块外调用let声明的变量则会报错

验证:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
                var a = { name: "peter" }
                let b = { name: "lily" }
                console.log('inner a', a)//{name:"peter"}
                console.log('inner b', b)//{name:"lily"}
            }
            console.log('a', a)//a{name:"peter"}
            console.log('b', b)//Uncaught ReferenceError: b is not defined

(2)不存在变量提升,使用let命令声明的变量,只能在声明后使用,语法上称为“暂时性死区”

(3)var、let、const

定义变量

是否可以重复定义变量

是否可以修改变量

var

let

const

验证:

重复定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var a = 1;
var a = 2;
console.log('a',a)//a,2

let b = 1;
let b = 2;
console.log('b',b)//Uncaught SyntaxError: Identifier 'b' has already been declared

const c = 1;
const c= 2;
console.log('c',c)//Uncaught SyntaxError: Identifier 'c' has already been declared

修改变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var a = 1;
a = 2;
console.log('a',a)//a,2

let b = 1;
b = 2;
console.log('b',b)//b,2

const c = 1;
c= 2;
console.log('c',c)//Uncaught TypeError: Assignment to constant variable.

(4)ES65声明变量有两种方法:

var 命令和function命令

ES6声明变量有六种方法:

var命令、function命令、let命令、const命令、import命令和class命令

2.解构赋值

在ES6入门中分别介绍了:数组、对象、字符串、数值和布尔值、函数的参数的解构赋值。

先看个数组和对象的解构赋值:

数组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let [a,b,c] = [1,2,3]
console.log(a,b,c)// [1,2,3]

对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let {a,b,c} = {a:1,b:2,c:3}
console.log(a,b,c) // 1,2,3

要点:

  • 等号两边结构一致
  • 定义和赋值同时完成

若等号两边结构不一致,则会报错,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let [{a,b,c},d] = {a:1,b:2,c:3,d:4}
console.log(a,b,c,d) // Uncaught TypeError: {(intermediate value)(intermediate value)(intermediate value)(intermediate value)} is not iterable

若不是定义和解构同时完成,则会报错在解构声明中缺少初始化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let [a,b,c]
[a,b,c] = [1,2,3]
console.log(a,b,c)// Uncaught SyntaxError: Missing initializer in destructuring declaration

3.箭头函数

3.1 写法

箭头函数是ES6中定义函数的新形式,以前是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function name(arg1, arg2) {
...
}

ES6的形式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(arg1,arg2)=>{
...
}

而且还有一些简化的写法:

(1)如果只有一个参数,则()可省略:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
arg1 => {
...
}

(2)如果函数体只有一句,则{}可省略:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(arg1, arg2) => 表达式

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let add_salary = (salary) => { return salary + 2000};
console.log(add_salary(1000)) // 3000

上述即是只有一个参数,所以可以省略()。另外函数体也只有一句表达式,{}和return都可以省略,简化写法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let add_salary = salary => salary + 2000;
console.log(add_salary(1000)) // 3000

3.2箭头函数的优点

(1)写起来更简洁

(2)会改变this

普通函数中[1]:

(1)谁调用this就指向谁

(2)在默认情况(非严格模式下,未使用 'use strict'),没找到直接调用者,则this指向 window

(3)在严格模式下,没有直接调用者的函数中的this是 undefined

(4)使用call,apply,bind绑定的,this指向绑定的对象

验证(1):

谁调用this就指向谁

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        var obj = {
                say: function () {
                    console.log('this in js', this) // obj
                }
            }
            obj.say();

验证(2):

在默认情况(非严格模式下),没找到直接调用者,则this指向 window

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            var obj = {
                say: function () {
                    setTimeout(function () {
                        console.log('this in js', this) // window
                    })
                }
            }
            obj.say();

验证(3):

在严格模式下,没有直接调用者的函数中的this是 undefined

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            function test() {
                'use strict';
                console.log(this); //非严格模式下是window,严格模式下是undefined
            }
            test();

验证(4):

使用call绑定的,this指向绑定的对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            function test() {
                console.log('this', this)
                var arr = [1, 2, 3]
                arr.map(function (item) {
                    console.log('this in js', this)
                })
            }
            test.call({ a: 4 })

结果:

箭头函数中:

this所在函数定义在哪个对象下,this就指向谁。注意this就指向定义时所作的对象,而不是使用时所在对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function test() {
    console.log('this', this)
    var arr = [1, 2, 3]
    arr.map(item => console.log('this in es6', this))
}
test.call({ a: 4 })

结果:

这块具体内容建议看下ES6入门,写得很清楚。

4.字符串的一些扩展

4.1 获取开头结尾包含的方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let s = 'Hello world!';
if(s.startsWith('Hello')){
    console.log("s.startsWith('Hello')")
}
if(s.endsWith('d!')){
    console.log("s.endsWith('!')")
}
if(s.includes('o')){
    console.log("s.includes('o')")
}

4.2 模板字符串(常用)

用``,可以当普通字符串使用,也可以在字符串中嵌入变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let [name,age] = ["Peter",10];
console.log(`my name is ${name},I'm ${age} old.`) //my name is Peter,I'm 10 old.

5.数组方法

5.1扩展运算符(...)

扩展运算符三个点(...)是将一个数组转为用逗号分隔的参数序列。

(1)可以用来复制数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// ES5
let arr1 = [1,2,3];
let arr2 = arr1.concat();
arr2[0] = 4;
console.log('arr1',arr1) // arr1 [1,2,3]
console.log('arr2',arr2) // arr2 [4,2,3] 

ES6可以直接arr2 = [...arr1];来复制数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// ES6
let arr1 = [1,2,3];
let arr2 = [...arr1];
arr2[0] = 4;
console.log('arr1',arr1) // arr1 [1,2,3]
console.log('arr2',arr2) // arr2 [4,2,3] 

(2)可以用来合并数组

ES5的写法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
arr1.concat(arr2);

ES6的写法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let arr3 = [...arr1,...arr2];
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//ES5
let arr1 = [1,2,3];
let arr2 = [4,5];
arr1.concat(arr2); // [1,2,3,4,5]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//ES6
let arr3 = [...arr1,...arr2]; //[1,2,3,4,5]

(3)与解构赋值结合来生成数组

这里扩展运算符必须放在参数的最后一位,否则会报错:

验证:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let [a,...args] = [1,2,3,4];
console.log('a',a) // a,1
console.log('args',args) // args,[2,3,4]

不放最后一位则会报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let [a,...args,b] = [1,2,3,4];
//报错:Uncaught SyntaxError: Rest element must be last element
console.log('a',a) 
console.log('args',args) 

5.2 forEach、map、filter、reduce

首先说明,forEach、map、filter、reduce都不会改变原数组

(1)forEach的作用:

单纯做遍历,没有返回值。支持三个参数:第一个是遍历的数组元素,第二个是索引,第三个是遍历的当前数组:

验证:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let arr1 = [1, 2, 3, 4];
let sum1 = 0;
let sum2 = arr1.forEach((value,index,array)=>{
    console.log('value',value)
    console.log('index',index)
    console.log('array',array)
    sum1 += value;
})
console.log('arr1',arr1) // arr1 [1, 2, 3, 4]
console.log('sum1',sum1) // sum1,10
console.log('sum2',sum2) // sum2,undefined

可以看出sum2为undefined,说明forEach就是纯粹做遍历的,没有返回值。

(2)map的作用:

遍历原数组,对每个元素处理完再放入新数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[1,2,3].map(item => item +1); // [2,3,4]
[20,30,40,60].map(item => item > 50)// [false, false, false, true]

(3)filter的作用:

过滤,遍历原数组,将满足条件的元素放入新数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let arr1 = [1,2,3,4];
let arr2 = arr1.filter(item => item%2 == 0);
console.log('arr1',arr1) // [1,2,3,4]
console.log('arr2',arr2) // [2,4]

(4)reduce的作用:

遍历数组元素,通过回调函数最终输出一个值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let sum = arr1.reduce((acc, item) => acc + item)
console.log('sum',sum) // sum,55

6.小结

本文主要是列举了ES6的一些基本知识点,并对应附带了一些验证的demo,下一篇将继续介绍后面的知识点。如有问题,欢迎指正。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
react源码解析19.手写迷你版react
react源码解析19.手写迷你版react 视频课程(高效学习):进入课程 课程目录: 1.开篇介绍和面试题 2.react的设计理念 3.react源码架构 4.源码目录结构和调试 5.jsx&核心api 6.legacy和concurrent模式入口函数 7.Fiber架构 8.render阶段 9.diff算法 10.commit阶段 11.生命周期 12.状态更新流程 13.hooks源码 14.手写hooks 15.scheduler&Lane 16.concurrent模式 17.contex
全栈潇晨
2021/06/24
8120
【React进阶-3】从零实现一个React(下)
这篇文章给大家介绍一下我们如何自己去实现一个类似于React这样的框架,当然,我们并不会去实现React里面所有的内容,只是去将React基础性的功能实现一遍,让大家对React的认识更加的深入。因为篇幅有限,所以我将这篇文章拆分成了上、下两部分,此文是下篇。
X北辰北
2022/02/21
7590
【React进阶-3】从零实现一个React(下)
手写简易版 React 来彻底搞懂 fiber 架构
React 16 之前和之后最大的区别就是 16 引入了 fiber,又基于 fiber 实现了 hooks。整天都提 fiber,那 fiber 到底是啥?它和 vdom 是什么关系?
神说要有光zxg
2022/03/03
8510
手写简易版 React 来彻底搞懂 fiber 架构
实现一个小而全的React
我们需要一个可以转换 jsx 的 vanilla js 环境,使用 vite 可以很方便设置好我们的开发环境
玖柒的小窝
2021/10/06
5440
实现一个小而全的React
手写系列-实现一个铂金段位的React
为什么是铂金呢,因为和王者还有很远的距离。本文仅实现简单版本的 React,参考 React 16.8 的基本功能,包括虚拟 DOM、Fiber、Diff 算法、函数式组件、hooks 等。
winty
2021/07/27
9060
从零开始的 React 再造之旅
https://segmentfault.com/a/1190000021689852
ConardLi
2020/02/24
8850
从零开始的 React 再造之旅
怎样徒手写一个React
下面先实现一个最简单的页面渲染,快速了解 JSX、React、DOM 元素的联系。
helloworld1024
2022/10/13
6700
从实现一个React到深度理解React框架核心原理
这篇文章循序渐进地介绍实现以下几个概念,遵循本篇文章基本就能搞懂为啥需要fiber,为啥需要commit和phases、reconciliation阶段等原理。本篇文章又不完全和原文一致,这里会加入我自己的一些思考,比如经过performUnitOfWork处理后fiber tree和element tree的联系等。
夏天的味道123
2022/10/17
6160
React核心技术浅析
这段代码的意思是通过 ReactDOM.render() 方法将 h1 包裹的JSX元素渲染到id为“root”的HTML元素上. 除了在JS中早已熟知的 document.getElementById() 方法外, 这段代码中还包含两个知识点:
夏天的味道123
2022/09/26
1.7K0
手写React的Fiber架构,深入理解其原理
熟悉React的朋友都知道,React支持jsx语法,我们可以直接将HTML代码写到JS中间,然后渲染到页面上,我们写的HTML如果有更新的话,React还有虚拟DOM的对比,只更新变化的部分,而不重新渲染整个页面,大大提高渲染效率。到了16.x,React更是使用了一个被称为Fiber的架构,提升了用户体验,同时还引入了hooks等特性。那隐藏在React背后的原理是怎样的呢,Fiber和hooks又是怎么实现的呢?本文会从jsx入手,手写一个简易版的React,从而深入理解React的原理。
蒋鹏飞
2020/10/15
1.7K1
手写React的Fiber架构,深入理解其原理
react fiber 到底有多细
Fiber 是对 React 核心算法的重构,facebook 团队使用两年多的时间去重构 React 的核心算法,在 React16 以上的版本中引入了 Fiber 架构,极大的提高了大型react项目的性能,也激发了我对其实现的好奇。在研究源码的过程中,能发现很多比较细的点,有任务单元拆分的细,有任务调度、双缓冲、节点复用等优化的细,都非常值得我们学习,接下来就带大家看看react fiber 到底有多细。
有赞coder
2021/05/14
8030
react fiber 到底有多细
【React进阶-2】从零实现一个React(上)
这篇文章给大家介绍一下我们如何自己去实现一个类似于React这样的框架,当然,我们并不会去实现React里面所有的内容,只是去将React基础性的功能实现一遍,让大家对React的认识更加的深入。因为篇幅有限,所以我将这篇文章拆分成了上、下两部分,此文是上篇。
X北辰北
2022/02/21
1.3K0
【React进阶-2】从零实现一个React(上)
这可能是最通俗的 React Fiber 打开方式
作者:荒山 https://juejin.im/post/5dadc6045188255a270a0f85
Nealyang
2019/10/24
2.3K1
这可能是最通俗的 React Fiber 打开方式
读懂React原理之调和与Fiber
Fiber 架构是React16中引入的新概念,目的就是解决大型 React 应用卡顿,React在遍历更新每一个节点的时候都不是用的真实DOM,都是采用虚拟DOM,所以可以理解成fiber就是React的虚拟DOM,更新Fiber的过程叫做调和,每一个fiber都可以作为一个执行单元来处理,所以每一个 fiber 可以根据自身的过期时间expirationTime,来判断是否还有空间时间执行更新,如果没有时间更新,就要把主动权交给浏览器去渲染,做一些动画,重排( reflow ),重绘 repaints 之类的事情,这样就能给用户感觉不是很卡。
xiaofeng123aa
2022/10/03
4650
这可能是最通俗的 React Fiber 打开方式
写一篇关于 React Fiber 的文章, 这个 Flag 立了很久,这也是今年的目标之一。最近的在掘金的文章获得很多关注和鼓励,给了我很多动力,所以下定决心好好把它写出来。我会以最通俗的方式将它讲透, 因此这算是一篇科普式的文章。不管你是使用React、还是Vue,这里面的思想值得学习学习!
前端劝退师
2019/12/02
6220
由浅入深React的Fiber架构
JavaScript是单线程运行的。在浏览器环境中,他需要负责页面的JavaScript解析和执行、绘制、事件处理、静态资源加载和处理。而且只能一个任务一个任务的执行,如果其中某个任务耗时很长,那后面的任务则执行不了,在浏览器端则会呈现卡死的状态。
Careteen
2022/02/14
1.8K0
由浅入深React的Fiber架构
React源码之深度理解diff算法
上一章中 react 的 render 阶段,其中 begin 时会调用 reconcileChildren 函数, reconcileChildren 中做的事情就是 react 知名的 diff 过程,本章会对 diff 算法进行讲解。
goClient1992
2022/12/09
4310
React.createElement和ReactDom.render方法简单思路
实际上,JSX 仅仅只是 React.createElement(component, props, ...children) 函数的语法糖,因此,使用 JSX 可以完成的任何事情都可以通过纯 JavaScript 完成。 例如,用 JSX 编写的代码: class Hello extends React.Component { render() { return <div>Hello {this.props.toWhat}</div>; } } ReactDOM.render( <H
刘嘿哈
2022/10/25
3080
【Fiber】: [转]React 为什么使用链表遍历 Fiber 树
To educate myself and the community, I spend a lot of time reverse-engineering web technologies and writing about my findings. In the last year, I’ve focused mostly on Angular sources which resulted in the biggest Angular publication on the web — Angular-In-Depth. Now the time has come to dive deep into React. Change detection has become the main area of my expertise in Angular, and with some patience and a lot of debugging, I hope to soon achieve that level in React.
WEBJ2EE
2021/02/26
7470
【Fiber】: [转]React 为什么使用链表遍历 Fiber 树
【Fiber】:[译]深入解析React的新协调算法
深入研究 React 的新架构 Fiber,了解新协调算法的两个主要阶段。我们将详细了解 React 如何更新组件状态(state)、属性(props)以及如何处理子元素(children)。
WEBJ2EE
2021/02/26
6700
【Fiber】:[译]深入解析React的新协调算法
相关推荐
react源码解析19.手写迷你版react
更多 >
LV.1
顺丰同城科技高级前端研发
目录
  • 0,本文适合人群和主要内容
  • 1.let、const
  • 2.解构赋值
  • 3.箭头函数
    • 3.1 写法
    • 3.2箭头函数的优点
  • 4.字符串的一些扩展
    • 4.1 获取开头结尾包含的方法
    • 4.2 模板字符串(常用)
  • 5.数组方法
    • 5.1扩展运算符(...)
    • 5.2 forEach、map、filter、reduce
  • 6.小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档