彻底搞懂 ES6/ES2015 JS 语法

2023-10-27

目录

一、ES6 标准介绍

二、最常用的ES6 特性

1、let, const

2、class, extends, super

3、arrow function

4、template string

5、destructuring

6、default, rest

7、import export

三、ES6 module 的其它高级用法

终极秘籍

总结


一、ES6 标准介绍

ECMAScript 6(以下简称ES6),JavaScript 语言的下一代标准。因为当前版本的ES6 是2015年发布的,所以又称ECMAScript 2015。

也就是说,ES6就是ES2015。

虽然目前并不是所有浏览器都能兼容ES6全部特性,但越来越多的程序员在实际项目当中已经开始使用ES6了。所以就算你现在不打算使用ES6,但为了看懂别人的你也该懂点ES6的语法了...

在我们正式讲解ES6语法之前,我们得先了解下Babel。
Babel

Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在现有环境执行。大家可以选择自己习惯的工具来使用使用Babel,具体过程可直接在Babel官网查看:

https://babeljs.io/docs/setup/

 

 

二、最常用的ES6 特性

let, const, class, extends, super, arrow functions, template string, destructuring, default, rest arguments
这些是ES6最常用的几个语法,基本上学会它们,我们就可以走遍天下都不怕啦!我会用最通俗易懂的语言和例子来讲解它们,保证一看就懂,一学就会。

1、let, const

这两个的用途与 var 类似,都是用来声明变量的,而且是全局作用域,但在实际运用中他俩都有各自的特殊用途。
首先来看下面这个例子:

 

var name = 'zach'

while (true) {
    var name = 'obama'
    console.log(name)  //obama
    break
}

console.log(name)  //obama

使用var两次输出都是obama,这是因为:ES5只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。第一种场景就是你现在看到的内层变量覆盖外层变量。

而  let 则实际上为 JavaScript 新增了块级作用域。用它所声明的变量,只在let命令所在的代码块内有效。

 

let name = 'zach'

while (true) {
    let name = 'obama'
    console.log(name)  //obama
    break
}

console.log(name)  //zach

另外一个  var 带来的不合理场景就是用来计数的循环变量泄露为全局变量,看下面的例子:

 

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 10

上面代码中,变量i是var声明的,在全局范围内都有效。所以每一次循环,新的i值都会覆盖旧值,导致最后输出的是最后一轮的i的值。而使用let则不会出现这个问题。

 

var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 6

再来看一个更常见的例子,了解下如果不用ES6,而用闭包(嵌套函数)如何解决这个问题

 

var clickBoxs = document.querySelectorAll('.clickBox')
for (var i = 0; i < clickBoxs.length; i++){
    clickBoxs[i].onclick = function(){
        console.log(i)
    }
}

我们本来希望的是点击不同的clickBox,显示不同的i,但事实是无论我们点击哪个clickBox,输出的都是5。下面我们来看下,如何用闭包(两层函数作用域,即函数的函数作用域)搞定它。

 

function iteratorFactory(i){
    var onclick = function(e){
        console.log(i)
    }
    return onclick;
}
var clickBoxs = document.querySelectorAll('.clickBox')
for (var i = 0; i < clickBoxs.length; i++){
    clickBoxs[i].onclick = iteratorFactory(i)
}

const也用来声明变量,但是声明的是常量。一旦声明,常量的值就不能改变。

 

const PI = Math.PI

PI = 23 //Module build failed: SyntaxError: /es6/app.js: "PI" is read-only

当我们尝试去改变用const声明的常量时,浏览器就会报错。
const有一个很好的应用场景,就是当我们引用第三方库时声明的变量用const来声明可以避免未来不小心重命名而导致出现bug:

 

const monent = require('moment')

2、class, extends, super(引用父类)

这三个特性涉及了ES5 中最令人头疼的的几个部分:原型、构造函数,继承...你还在为它们复杂难懂的语法而烦恼吗?你还在为指针到底指向哪里而纠结万分吗?

有了ES6我们不再烦恼!

ES6提供了更接近传统语言的写法,引入了Class(类)这个概念。新的class写法让对象原型的写法更加清晰、更像面向对象编程的语法,也更加通俗易懂。

 

class Animal {
    constructor(){
        this.type = 'animal'
    }
    says(say){
        console.log(this.type + ' says ' + say)
    }
}

let animal = new Animal()
animal.says('hello') //animal says hello

class Cat extends Animal {
    constructor(){
        super()
        this.type = 'cat'
    }
}

let cat = new Cat()
cat.says('hello') //cat says hello

上面代码首先用  class 定义了一个“类”,可以看到里面有一个  constructor 方法,这就是构造方法,而this关键字则代表实例对象。简单地说,constructor 内定义的方法和属性是实例对象自己的,而  constructor 外定义的方法和属性则是所有实力对象可以共享的。

Class之间可以通过extends关键字实现继承,这比ES5的通过修改原型链实现继承,要清晰和方便很多。上面定义了一个Cat类,该类通过extends关键字,继承了Animal类的所有属性和方法。

super关键字,它指代父类的实例(即父类的this对象)。子类必须在constructor方法中调用super方法,否则新建实例时会报错。这是因为子类没有自己的this对象,而是继承父类的this对象,然后对其进行加工。如果不调用super方法,子类就得不到this对象。

ES6 的继承机制,实质是先创造父类的实例对象this(所以必须先调用super方法),然后再用子类的构造函数修改this。

PS如果你写react的话,就会发现以上三个东西在最新版React中出现得很多。创建的每个component都是一个继承React.Component的类。详见react文档

3、arrow function

这个恐怕是ES6最最常用的一个新特性了,用它来写function比原来的写法要简洁清晰很多:

 

function(i){ return i + 1; } //ES5
(i) => i + 1 //ES6 或一个参数时省略为 i=>i+1

简直是简单的不像话对吧...
如果方程比较复杂,则需要用{}把代码包起来:

 

function(x, y) { 
    x++;
    y--;
    return x + y;
}
(x, y) => {x++; y--; return x+y}

除了看上去更简洁以外,arrow function还有一项超级无敌的功能!
长期以来,JavaScript语言的  this 对象一直是一个令人头痛的问题,在对象方法中使用this,必须非常小心。例如:

 

class Animal {
    constructor(){
        this.type = 'animal'
    }
    says(say){
        setTimeout(function(){
            console.log(this.type + ' says ' + say)
        }, 1000)
    }
}

var animal = new Animal()
animal.says('hi')  //undefined says hi

运行上面的代码会报错,这是因为  setTimeout 中的  this 指向的是全局对象(闭包中的未定义变量,默认指向全局作用域)。所以为了让它能够正确的运行,传统的解决方法有两种:

  1. 第一种是将this传给self, 再用self来指代this

     says(say){
         var self = this;
         setTimeout(function(){
             console.log(self.type + ' says ' + say)
         }, 1000)
    

2.第二种方法是用bind(this),即
says(say){
setTimeout(function(){
console.log(self.type + ' says ' + say)
}.bind(this), 1000)
但现在我们有了箭头函数,就不需要这么麻烦了:

 

class Animal {
    constructor(){
        this.type = 'animal'
    }
    says(say){
        setTimeout( () => {
            console.log(this.type + ' says ' + say)
        }, 1000)
    }
}
var animal = new Animal()
animal.says('hi')  //animal says hi

当我们使用箭头函数时,函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
并不是因为箭头函数内部有绑定 this 的机制,实际原因是箭头函数根本没有自己的this,它的 this 是继承外面的,因此内部的 this 就是外层代码块的this。

4、template string

这个东西也是非常有用,当我们要插入大段的html 内容到文档中时,传统的写法非常麻烦,所以之前我们通常会引用一些模板工具库,比如mustache等等。

大家可以先看下面一段代码:

$("#result").append(
  "There are <b>" + basket.count + "</b> " +
  "items in your basket, " +
  "<em>" + basket.onSale +
  "</em> are on sale!"
);

我们要用一堆的'+'号来连接文本与变量,而使用ES6的新特性模板字符串``后,我们可以直接这么来写:

$("#result").append(`
  There are <b>${basket.count}</b> items
   in your basket, <em>${basket.onSale}</em>
  are on sale!
`);

用反引号(\来标识起始,用${} 来引用变量,而且所有的空格和缩进都会被保留在输出之中,是不是非常爽?!

React Router从第1.0.3版开始也使用ES6语法了,比如这个例子:
<Link to={\/taco/${taco.name}`}>${taco.name}</Link>`
React Router

5、destructuring

ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为 解构(Destructuring)

看下面的例子:

let cat = 'ken'
let dog = 'lili'
let zoo = {cat: cat, dog: dog}
console.log(zoo)  //Object {cat: "ken", dog: "lili"}

用ES6完全可以像下面这么写:

 

let cat = 'ken'
let dog = 'lili'
let zoo = {cat, dog}
console.log(zoo)  //Object {cat: "ken", dog: "lili"}

反过来可以这么写:

 

let dog = {type: 'animal', many: 2}
let { type, many} = dog   //import { validateUserName } from '@/utils/validate'
console.log(type, many)   //animal 2

6、default, rest

default 很简单,意思就是默认值。大家可以看下面的例子,调用animal()方法时忘了传参数,传统的做法就是加上这一句type = type || 'cat'来指定默认值。

 

function animal(type){
    type = type || 'cat'  
    console.log(type)
}
animal()

如果用ES6我们而已直接这么写:

 

function animal(type = 'cat'){
    console.log(type)
}
animal()

最后一个rest 语法也很简单,直接看例子:

 

function animals(...types){
    console.log(types)
}
animals('cat', 'dog', 'fish') //["cat", "dog", "fish"]

而如果不用ES6的话,我们则得使用ES5的arguments

 

7、import export

这两个家伙对应的就是es6自己的module功能。

我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小工程,再用一种简单的方法把这些小工程连接在一起。

这有可能导致两个问题:

  1. 一方面js代码变得很臃肿,难以维护

  2. 另一方面我们常常得很注意每个script标签在html中的位置,因为它们通常有依赖关系,顺序错了可能就会出bug

在es6之前为解决上面提到的问题,我们得利用第三方提供的一些方案,主要有两种CommonJS(服务器端)和AMD(浏览器端,如require.js)。

如果想了解更多AMD,尤其是require.js,可以参看这个教程:why modules on the web are useful and the mechanisms that can be used on the web today to enable them

而现在我们有了es6的module功能,它实现非常简单,可以成为服务器和浏览器通用的模块解决方案

ES6模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS和AMD模块,都只能在运行时确定这些东西。

上面的设计思想看不懂也没关系,咱先学会怎么用,等以后用多了、熟练了再去研究它背后的设计思想也不迟!好,那我们就上代码...

传统的写法

首先我们回顾下require.js的写法。假设我们有两个js文件:  index.jscontent.js,现在我们想要在index.js中使用content.js返回的结果,我们要怎么做呢?

首先定义:

//content.js
define('content.js', function(){
    return 'A cat';
})

然后require:

//index.js
require(['./content.js'], function(animal){
    console.log(animal);   //A cat
})

那CommonJS是怎么写的呢?

//index.js
var animal = require('./content.js')

//content.js
module.exports = 'A cat'

ES6的写法

//index.js
import animal from './content'

//content.js
export default 'A cat'

以上我把三者都列出来了,妈妈再也不用担心我写混淆了...

三、ES6 module 的其它高级用法

//content.js

export default 'A cat'    
export function say(){
    return 'Hello!'
}    
export const type = 'dog' 

上面可以看出,export 命令除了输出变量,还可以输出函数,甚至是类(react的模块基本都是输出类)

//index.js

import { say, type } from './content'  
let says = say()
console.log(`The ${type} says ${says}`)  //The dog says Hello

这里输入的时候要注意:大括号里面的变量名,必须与被导入模块(content.js)对外接口的名称相同。

如果还希望输入 content.js 中输出的默认值(default), 可以写在大括号外面。

//index.js

import animal, { say, type } from './content'  
let says = say()
console.log(`The ${type} says ${says} to ${animal}`)  
//The dog says Hello to A cat

修改变量名

此时我们不喜欢type这个变量名,因为它有可能重名,所以我们需要修改一下它的变量名。在es6中可以用as实现一键换名。

//index.js

import animal, { say, type as animalType } from './content'  
let says = say()
console.log(`The ${animalType} says ${says} to ${animal}`)  
//The dog says Hello to A cat

模块的整体加载

除了指定加载某个输出值,还可以使用整体加载,即用星号(*)指定一个对象,所有输出值都加载在这个对象上面。

//index.js

import animal, * as content from './content'  
let says = content.say()
console.log(`The ${content.type} says ${says} to ${animal}`)  
//The dog says Hello to A cat

通常星号 结合 as 一起使用比较合适。

终极秘籍

考虑下面的场景:上面的content.js一共输出了三个变量(default, say, type),假如我们的实际项目当中只需要用到type这一个变量,其余两个我们暂时不需要。我们可以只输入一个变量:

import { type } from './content' 

由于其他两个变量没有被使用,我们希望代码打包的时候也忽略它们,抛弃它们,这样在大项目中可以显着减少文件的体积。

ES6帮我们实现了!

不过,目前无论是 webpack 还是 browserify 都还不支持这一功能...

如果你现在就想实现这一功能的话,可以尝试使用rollup.js

他们把这个功能叫做Tree-shaking,哈哈哈,意思就是打包前让整个文档树抖一抖,把那些并未被依赖或使用的东西统统抖落下去。。。

看看他们官方的解释吧:

Normally if you require a module, you import the whole thing. ES2015 lets you just import the bits you need, without mucking around with custom builds. It's a revolution in how we use libraries in JavaScript, and it's happening right now.

未完待续

希望更全面了解ES6,伙伴们可以去看 阮一峰所著的电子书  ECMAScript 6入门

总结

以上就是ES6 最常用的一些语法,可以说这20%的语法,在ES6的日常使用中占了80%...



作者:Zachary_Wang
链接:https://www.jianshu.com/p/ebfeb687eb70
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

彻底搞懂 ES6/ES2015 JS 语法 的相关文章

  • Android移动开发-蓝牙(BlueTooth)设备检测连接的实现

    无论是WIFI还是4G网络 建立网络连接后都是访问互联网资源 并不能直接访问局域网资源 比如两个人在一起 A要把手机上的视频传给B 通常情况是打开手机QQ 通过QQ传送文件给对方 不过上传视频很耗流量 如果现场没有可用的WIFI 手机的数据
  • 千图app官网下载

    千图app官网下载 http qiantuapp com
  • 计算机图形学学习笔记(一):坐标表示

    几种不同的笛卡尔坐标系 建模坐标系 在各自的参照系中构造每一对象的形状 比如树或家具 这些坐标系称为建模坐标系 modeling coordinate 或局部坐标系 local coordinate 或主坐标系 master coordin
  • 搭建家庭影音媒体中心 --公网远程连接Jellyfin流媒体服务器

    文章目录 前言 1 安装Home Assistant 2 配置Home Assistant 3 安装cpolar内网穿透 3 1 windows系统 3 2 Linux系统 3 3 macOS系统 4 映射Home Assistant端口
  • 如何把一张图片做成一个好看的电脑图标

    话不多说直奔主题 第一步 首先注意一下自己的桌面也就是想把什么东西的图标给换了 举个例子1 假如我们想换WPS图标 这时可以直接右击鼠标 gt 属性 gt 更换图标 然后找到目的图标位置更换就行了 2 假如我们想把一个 vbs程序的图标换了
  • 91.2%准确率!ViTAEv2:视觉Transformer新工作!更大模型、更多任务、更高效率

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 转载自 京东探索研究院 以超大规模模型和无监督预训练方法为代表的超级深度学习技术 正在深刻地影响着人工智能领域的研究进展 在机器视觉 自然语言处理 多模态分析等多个领域
  • tiledmap 图块属性_TiledMap 组件参考

    TiledMap 组件参考 TiledMap 地图 用于在游戏中显示 TMX 格式的地图 点击 属性检查器 下方的 添加组件 按钮 然后从 渲染组件 中选择 TiledMap 即可添加 TiledMap 组件到节点上 TiledMap 的脚
  • leetcode刷题记录

    文章目录 前言 一 leetcode 997 有序数组的平方 前言 提示 以下是本篇文章正文内容 下面案例可供参考 一 leetcode 997 有序数组的平方 题目描述 给你一个按 非递减顺序 排序的整数数组 nums 返回 每个数字的平
  • 阿里开源自主研发的 DFSMN 语音识别模型,引谷歌论文引用

    近日 阿里巴巴达摩院机器智能实验室语音识别团队 推出了新一代语音识别模型 DFSMN 不仅被谷歌等国外巨头在论文中重点引用 更将全球语音识别准确率纪录提高至 96 04 基于世界最大的免费语音识别数据库LibriSpeech 阿里在GitH
  • 华为OD机试 - 停车场车辆统计(Java)

    题目描述 特定大小的停车场 数组cars 表示 其中1表示有车 0表示没车 车辆大小不一 小车占一个车位 长度1 货车占两个车位 长度2 卡车占三个车位 长度3 统计停车场最少可以停多少辆车 返回具体的数目 输入描述 整型字符串数组cars
  • linux shell 编程

    转自 http blog csdn net fpmystar article details 4183678 和 http blog csdn net buutterfly article details 6615162 在进行linux测
  • 详解卡尔曼滤波原理

    详解卡尔曼滤波原理 在网上看了不少与卡尔曼滤波相关的博客 论文 要么是只谈理论 缺乏感性 或者有感性认识 缺乏理论推导 能兼顾二者的少之又少 直到我看到了国外的一篇博文 真的惊艳到我了 不得不佩服作者这种细致入微的精神 翻译过来跟大家分享一
  • 【Java核心技术 卷I】第二章 Java程序设计环境

    本章概述 2 1 安装Java开发工具包 要想下载 Java 开发1 具包 可以访问 Oracle 网站 一些专业术语 JDK JRE Java SE 下载JDK 设置JDK 具体设置JDK操作可以看这里 接下来还有安装库源文件和文档 文档
  • 网页爬虫逆向与AST入门系列教程(结语)

    网页爬虫逆向与AST入门系列教程 结语 在这一系列的教程中 我们深入探讨了网页爬虫逆向与AST的基本概念 生成方法以及其在代码混淆解析 反爬虫技术解析 数据提取与分析 安全检测以及代码转换等方面的应用 一 初识网页爬虫逆向与AST 在该教程
  • Docker学习笔记(三)

    文章目录 Docker学习笔记 三 1 布署nginx 2 Tomcat安装 3 部署ES kibana 4 可视化面板 4 1下载命令 4 2什么是portainer Docker学习笔记 三 1 布署nginx 先使用docker pu
  • Python基础:列表、字典、json之间的相互转换

    Python基础 列表 字典 json之间的相互转换 1 列表 字典 json的形式 2 列表中添加字典 3 字典中添加列表 4 列表 字典与json的转换 前言 对于刚接触Python的新鸟来说 数据之间的转换特别蛋疼 今天我就来说一下

随机推荐

  • RT-Thread记录(十六、SFUD组件 — SPI Flash的读写)

    从本文开始 测试学习一些 RT Thread 常用的组件与软件包 先从刚学完的 SPI 设备开始 目录 前言 一 SFUD 组件简介 1 1 基本简介 1 2 SFUD 对 Flash 的管理 二 SFUD 组件操作函数 2 1 初始化相关
  • 多项式朴素贝叶斯分类器_多项式朴素贝叶斯分类器的主题预测

    多项式朴素贝叶斯分类器 In Analytics Vidhya Hackathon there was a problem statement for text prediction of topic subject to which cl
  • LearnC++___CH4

    4 1 Introduction to fundamental data types Data types All you need to do is pick a data type for your object that best m
  • [每日两题系列]刷算法题咯~~

    今日题目 打家劫舍 打家劫舍II 本系列所选题目均来自力扣或者牛客网站 所选题目主要是以其中的简单题为主 中等题为辅 包含少数困难题 原因是 本人目前能力还不够 开展这个系列的目的是督促自己 在暑假的时间里也要保持有一定的刷题量 拒绝摆烂
  • springBoot集成mybatis无实体类配置

    1 新建spring项目参照https blog csdn net linsa pursuer article details 84304924 注意这里开始创建jar包不要选择jpa 选择JDBC和Mybatis web和mysql基本要
  • 软件开发参考网站

    https how2j cn https www yiibai com https www bookstack cn
  • 前端Token管理(获取、过期处理、异常处理及优化)

    本文实例代码使用的是vue axios 什么是Token Token是服务端生成的一串字符串 以作客户端进行请求的一个令牌 当第一次登录后 服务器生成一个Token便将此Token返回给客户端 以后客户端只需带上这个Token前来请求数据即
  • CentOS7安装Gitlab及使用

    安装Gitlab 1 安装相关依赖 yum y install policycoreutils openssh server openssh clients postfix 2 启动ssh服务 设置为开机启动 systemctl enabl
  • 解决ubuntu 16.04进入系统紫屏

    我的情况是 按ctrl alt f1没用 按照网上的方法编辑grub也没用 方法 进入引导界面按e 进入grub界面 在右下角的Splash后面加nomodeset 把ro改成rw 按f10重新启动 这个方法我试了 不行 依然进不去ubun
  • Redis接口的调用

    1 hiredis是redis数据库的C接口 目录为 redis 3 2 6 deps hiredis 2 示例代码如下 include
  • Mysql中的Join算法

    一 Simple Nested Loop Join 简单的嵌套循环连接 简单来说嵌套循环连接算法就是一个双层for 循环 通过循环外层表的行数据 逐个与内层表的所有行数据进行比较来获取结果 当执行select from user tb1 l
  • .标识符和关键字的区别是什么

    1 标识符 定义 为包 类 接口 变量 方法 常量等凡是自己可以起名字的地方都叫标识符 规则 必须要遵守 否则 编译不通过 2 关键字 定义 被Java语言赋予了特殊含义 用做专门用途的字符串 单词 特点 关键字中所有字母都为小写
  • day-51 代码随想录算法训练营(19)动态规划 part 12

    309 买卖股票的最佳时机含冷冻期 分析 状态 gt 持有 卖出 冷冻期 冷冻期后没持有 思路 1 dp存储 四个状态 2 dp i 0 dp i 1 dp i 2 dp i 3 3 初始化 dp 0 0 prices i 4 遍历顺序 1
  • 机器学习---结课论文

    机器学习与隐私保护 结课论文 时间序列数据的隐私保护机器学习方法与挑战 摘 要 随着大数据时代的到来 时间序列数据在各个领域被广泛应用 然而 如何在利用这些数据的同时保护用户隐私成为了一个亟待解决的问题 本文回顾了时间序列数据的基本概念及其
  • Docker 教程

    Docker 教程 1 Docker 的优点 2 Ubuntu Docker 安装 3 Docker 使用 3 1 Docker Hello World 3 1 1 运行交互式的容器 3 1 2 启动容器 后台模式 3 1 3 停止容器 3
  • linux称手的终端管理器Zsh(Z shell)-图文安装超详细

    linux默认的shell太low了 iTerm2在macOS系统简直堪称终端管理神器 有一款可以平替iTem2的软件 Zsh Z shell Zsh 是一个为交互使用而设计的 shell 一 安装Zsh 1 yum安装zsh yum in
  • redis的安装与启动(Windows)

    下载地址 https github com MSOpenTech redis releases Redis 支持 32 位和 64 位 这个需要根据你系统平台的实际情况选择 这里我们下载 Redis x64 xxx zip压缩包到 C 盘
  • <(* ̄▽ ̄*)/低碳生活管理系统

    首次在博客园发布文章 都是个人理解 有很多不足 多多包涵 下面是对做过的作业低碳生活管理系统的剖析 一 建类 二 在Program 或自己命名的类 里调用SQL命名空间 三 Main方法的准备 四 创建主界面方法 五 创建显示碳消耗列表的方
  • 使用OpenCV+Python进行人脸识别

    先决条件 对图像分类的基本理解 Python 和深度学习知识 对深度学习中各种模块的概念理解 介绍 在这篇文章中 我们将看看什么是人脸识别 以及它与人脸检测有何不同 我们先简单了解一下人脸识别的原理 然后跳转到编码部分 在本文的最后 你将能
  • 彻底搞懂 ES6/ES2015 JS 语法

    目录 一 ES6 标准介绍 二 最常用的ES6 特性 1 let const 2 class extends super 3 arrow function 4 template string 5 destructuring 6 defaul