ECMAScript6

news2024/11/26 9:46:40

课程链接

目录

  • 相关介绍
    • 什么是ECMA
    • 什么是ECMAScript
    • 为什么学习ES6
  • let
  • const
  • 变量解构赋值
  • 模板字符串
  • 对象简化写法
  • 箭头函数
  • 函数参数的默认值
  • rest参数
  • 扩展运算符
  • Symbol
  • 迭代器
  • 生成器函数与调用
  • Promise
    • 介绍与基本用法
    • Promise封装读取文件
    • Promise.prototype...then方法
    • Promise.catch方法
  • Set
  • Map
  • class类
    • 介绍与初体验
    • 静态成员
    • 类的继承
    • 重写
    • get和set
  • ES6的数值扩展
  • 对象方法扩展
  • 模块化
  • 引入NPM包

相关介绍

什么是ECMA

中文名称是欧洲计算机制造商协会,这个组织的目标是评估、开发和认可电信和计算机标准。

什么是ECMAScript

是Ecma通过ECMA-262标准化的脚本程序设计语言

为什么学习ES6

  • ES6的版本变动内容最多,具有里程碑意义
  • ES6加入许多新的语法特性,变成实现更简单
  • ES6是前端发展趋势,就业必备技能

let

  • 声明变量
// 声明变量
let a;
let b,c;
let e = 100;
let f = 100, g = 200,h = [];
  • 变量不能重复声明
  • 块级作用域
    只在代码块里有效
  • 不存在变量提升
console.log(name); // undefined
var name = "qiu";
console.log(name); // 报错
let name = "qiu";
  • 不影响作用域链

const

  • 声明常量
// 声明常量
const AGE = 18;
console.log(AGE);
  • 一定要赋初始值
  • 一般常量使用大写
  • 常量值不能修改
  • 块级作用域
  • 对于数组和对象的元素修改,不算做对常量的修改,不会报错(引用地址并没有变)

变量解构赋值

允许直接从数组和对象中提取值并赋值

  1. 数组的解构
const hobby = ["吃","喝","玩","乐"];
let [h1,h2,h3,h4]= hobby;
console.log(h1); //"吃"
console.log(h2); //"喝"
console.log(h3); //"玩"
console.log(h4); //"乐"
  1. 对象的解构
const person = {
    name: "Peter",
    age: 12,
    sleep(){
        console.log("zzzzzzzz");
    }
}
let {name, age, sleep} = person;

模板字符串

  • 声明
// 模板字符串
let str = `模板字符串`
  • 内容中可以直接出现换行符
let str2 = `<ul><li>苹果<li><li>香蕉<li><ul>`;
  • 变量拼接
const fruits = ["苹果","香蕉","橘子","梨"];
let str3 = `我喜欢吃${fruits[2]}`;

对象简化写法

// 对象简化写法
let name = "lisa";
let sex = 1;
const student = {
    name,
    sex
}

箭头函数

// 箭头函数
 let fn = (a,b) =>{
     return a + b;
 }

特性:

  1. this是静态的,this始终指向函数声明时所在作用域下的this值 (没有自己的this,指向外部this)
let getName = ()=>{
   console.log(this.name);
}
function getName2() {
    console.log(this.name);
}
window.name = "window";
const school = {
    name:"TUST",
}

getName(); //"window"
getName2(); //"window"
getName.call(school); //"window"
getName2.call(school); //"TUST"
  1. 不能作为构造函数实例化对象
  2. 不能使用arguments变量
  3. 箭头函数的简写
    1)当形参有且只有一个的时候,可以省略小括号
let add = n => {
  return n + 1;
}

2)当代码题只有一条语句的时候,可以省略花括号
此时return也必须省略,且语句的执行结果就是函数的返回值

let add = n => n + 1;

函数参数的默认值

  • 一般把有初始值的形参放到最后
// 允许给函数参数赋值初始值
function add(a,b,c = 10) {
    return a + b + c;
}
add(1,3); //14
  • 与结构赋值结合使用
// 结合结构赋值使用
functionconnect({host, username, pass, port=3306}) {
    console.log(host, username, pass, port);
}
connectInfo = {
    host: "localhost",
    username: "root",
    pass: "root",
    port: 8080
}
connect(connectInfo);

rest参数

用于获取函数的实参,同来代替arguments
与arguments不同的是,arguments是对象,rest是数组
有多个rest参数必须放到最后function date(a,b,...args){}

function date(...args){
   console.log(args); // ['苹果', '香蕉', '橘子', '梨']
}
date("苹果","香蕉","橘子","梨");

扩展运算符

将数组转换为逗号分隔的参数序列

const fruits = ['苹果', '香蕉', '橘子', '梨'];
date(...fruits); // 等同于date("苹果","香蕉","橘子","梨");

Symbol

Symbol特点

  1. Symbol的值是唯一的,用来解决命名冲突的问题
  2. Symbol值不能与其他数据进行运算
  3. Symbol定义的对象属性不能使用for…in循环遍历,但是可以使用Reflect.ownKeys来获取对象的所有键名
let s = Symbol();
console.log(s,typeof s); //Symbol() 'symbol'

迭代器

工作原理

  1. 创建一个指针对象,指向当前数据结构的起始位置
  2. 第一次调用对象的next方法,指针自动指向数据结构的第一个成员
  3. 接下来不断调用next方法,指针一直往后移动,直到指向最有一个成员
  4. 每调用next方法返回一个包含value和done属性的对象

注:需要自定义遍历数据的时候,要想到迭代器

原生具备iterator接口的数据(可用for of 遍历)
Arrary、Arguments、Set、Map、String、TypedArray、NodeList

const fruits = ['苹果', '香蕉', '橘子', '梨'];

let iterator = fruits[Symbol.iterator](); //获取迭代器对象
console.log(iterator.next()); //{value: '苹果', done: false}
console.log(iterator.next()); //{value: '香蕉', done: false}
console.log(iterator.next()); //{value: '橘子', done: false}
console.log(iterator.next()); //{value: '梨', done: false}
console.log(iterator.next()); //{value: 'undefined', done: true}

生成器函数与调用

生成器其实就是一个特殊的函数

function * gen(){
    console.log("Hello generator");
    yield "abcdefg"; //可以看成函数分隔符
    //-----------------------------------------
    console.log("How are you?");
    yield "hijklmn";
    //-----------------------------------------
    console.log("I am fine. Thank you!");
    let str = yield "opqrst";
    //-----------------------------------------
    console.log(str); 
}
let iterator = gen();
// console.log(iterator); //gen {<suspended>}
iterator.next(); //Hello generator
console.log(iterator.next()); //How are you? {value: 'hijklmn', done: false}
iterator.next(); //I am fine. Thank you!
iterator.next("Bye bye"); //Bye bye

Promise

介绍与基本用法

const p = new Promise(function(resolve, reject){
    setTimeout(function(){
        // 成功情况
        // let data = "数据库中数据";
        // resolve(data); //执行成功回调

        // 失败情况
        let msg = "网络连接失败";
        reject(msg); //执行失败回调
    },1000)
})

// 调用Promise对象的then方法a
p.then(function(data){
    console.log("成功回调!!!",data);
},function(error){
    console.log("失败回调。。。。。",error);
})

Promise封装读取文件

const fs = require('fs');

const p = new Promise(function(resolve, reject){
    fs.readFile("./resources/readme.txt",(err,data)=> {
        // 如果失败,则执行错误回调
        if (err) reject(err);
        // 如果成功,则执行成功回调
        resolve(data);
    });
})

p.then(function(value){
    console.log(data.toString());
},function(reason) {
    console.log("获取失败",reason);
})

Promise.prototype…then方法

之前的例子

const p = new Promise(function(resolve, reject){
    setTimeout(function(){
        // 成功情况
        // let data = "数据库中数据";
        // resolve(data); //执行成功回调

        // 失败情况
        let msg = "网络连接失败";
        reject(msg); //执行失败回调
    },1000)
})

// 调用Promise对象的then方法
p.then(function(data){
    console.log("成功回调!!!",data);
},function(error){
    console.log("失败回调。。。。。",error);
})

p.then方法返回的是一个Promise对象,对象中有两个是,一个是PromiseState一个是PromiseResult
这两个属性,根据回调内容不同而不同

// 调用Promise对象的then方法
let pThen =p.then(function(data){
    console.log("成功回调!!!",data);
    // 1. 返回非Promise类型值,PromiseState为fulfilled,PromiseResult为undefined
    // return data;
    // 2. 返回非Promise类型值,PromiseState为该Promise的成功或失败结果,PromiseResult为结果参数
    // return new Promise(function(resolve,reject){
    //     resolve(123)
    // })
    // 3. 抛出错误,PromiseState为rejected,PromiseResult为抛出的错误
    throw "err";
},function(error){
    console.log("失败回调。。。。。",error);
})
console.log(pThen);

比如,此时结果就如下
在这里插入图片描述
可以通过在then中返回Promise进行链式调用,杜绝回调地狱问题

Promise.catch方法

就相当于then方法,不写第一个回调

p.catch(function(reason) {
    console.warn(reson);
})

Set

自动去重

// Set
let s= new Set(["苹果","香蕉","橘子","梨","橘子"]);
console.log(s); //Set(4) {'苹果', '香蕉', '橘子', '梨'}
// 元素格式
s.size;
// 添加元素
s.add("葡萄");
// 删除元素
s.delete("橘子");
// 检测
s.has("西瓜");
// 清空
s.clear();
// 循环 实现了iterator迭代器接口可以用forof
for (const iterator of s) {
    console.log(iterator);
}

Map

键值对集合

// Map
let m =new Map();
// 添加元素
m.set("name","qiu");
m.set({name:"qiu"},{obj:null});
// 键值对个数
m.size;
// 获取
m.get("name");
// 删除
m.delete("name");
// 清空
m.clear();
// 遍历 实现了iterator接口
for (const iterator of m) {
    console.log(m);
}

class类

介绍与初体验

对比一下ES5和ES6创建实例对象

// class
// ES5
function Phone(brand, price){
    this.brand = brand;
    this.price = price;
}
// 通过原型对象添加方法
Phone.prototype.open = function(){
    console.log("dangdangdangdang~");
}
// 实例化对象
let Huawei = new Phone('华为',5999);

// ES6
class Phone {
    // 构造方法 名字不能修改
    constructor(brand, price){
        this.brand = brand;
        this.price = price;
    }
    // 方法 不能使用open: function(){}形式
    open(){
        console.log("dangdangdangdang~");
    }

}
let Vivo = new Phone("Vivo",3999);

静态成员

属于类的属性,不属于实例对象

class Phone {
    // 静态成员
    static classify = "数码设备";
}

类的继承

ES5中的构造函数继承(父级就不写了,和上面一样)

// ES5
function AIPhone(brand, price, color, os) {
    Phone.call(this,brand,price);
    this.color = color;
    this.os = os;
}
// 设置子级构造函数的原型
AIPhone.prototype = new Phone;
AIPhone.prototype.constructor = AIPhone;

ES6中类的继承

// ES6
class AIPhone extends Phone {
    constructor(brand, price, color, os) {
        super(brand,price); //父类构造函数
        this.color = color;
        this.os = os;    
    }
}

重写

重写同名方法,当重写方法中不允许调用父类方法,只能直接覆盖

get和set

class Phone {
   // 构造方法 名字不能修改
   constructor(brand, price){
       this.brand = brand;
       this.price = price;
   }
   get color() {
       console.log("读取了color属性");
       return "黑色";
   }
   set color(newVal) {
       console.log("修改了color属性");
       // this.color = newVal;
   }
}
let vivoS9 = new Phone("Vivo",3999);
console.log(vivoS9.color);
vivoS9.color = "白色";
console.log(vivoS9.color);

ES6的数值扩展

  • Number.EPSILON是js表示的最小精度
  • 二进制和八进制:二进制0bxxx 八进制0oxxx 十进制xxx 十六进制0xxxx
  • Number.isFinite检测是否为有限数
  • Number.isNaN检测数值是否为NaN
  • Number.parseIntNumber.parseFloat字符串转为数字(整数/浮点数)
  • Number.isInteger判断是否为整数
  • Math.trunc将数字的小数部分抹掉
  • Math.sign判断一个数到底为正数(1)、负数(-1)还是零(0)

对象方法扩展

  • Object.is 判断两个值是否完全相等(与===的区别 NaN===NaN为false)
  • Object.assign 两个对象的合并(相同的覆盖,不同的保留)
  • Object.setPrototypeOf设置原型对象 Object.getPrototypeOf获取原型对象 (不建议使用)

模块化

将大文件拆分为多个小文件,再组合
优点:

  1. 防止命名冲突
  2. 代码复用
  3. 高维护性

主要有两个命令构成:export暴露和import引用

//test.js
// 分别暴露
export let school = "TUST";
export let add = "TJ";

//统一暴露
let school = "TUST"
let add = "TJ"
export {school, add}

// 默认暴露
export default {
	school: "TUST",
	add: "TJ"
}
//study.html
//<script type="module">
//通用引入方式
import * as text from "./text.js";

// 解构赋值形式
import {school, add as address} from "./text.js"; //分别暴露 重名用as取别名
import {default as text} from "./text.js"; //统一暴露 必须取别名

// 简便形式 只能对应默认暴露
import text from "./text.js";

还可以直接在标签上引用 (应该是vue中拆分出js文件)(一般不这么直接引,会有兼容问题)

<script src="./text.js" type="module">

在项目中,一般是需要使用工具将代码进行转换并打包,再通过标签引用来实现模块化

引入NPM包

  1. 通过npm i xxx命令安装
  2. 通过import 变量名 from "包名";引入

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

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

相关文章

javascript中的强制类型转换和自动类型转换

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;前端泛海 景天的主页&#xff1a;景天科技苑 文章目录 1.转换函数2.强制类型转换&#xff08;1&#xff09;Number类型强转&…

数字社交时代的引领者:Facebook的元宇宙探索

引言&#xff1a; 在当今数字社交时代&#xff0c;人们的社交方式正在经历着翻天覆地的变化。随着虚拟现实技术的不断发展和元宇宙概念的崛起&#xff0c;社交网络正朝着一个全新的未来迈进。作为全球最大的社交网络平台之一&#xff0c;Facebook正在积极探索元宇宙时代的社交…

串联谐振电路基础知识1

电路图 公式 IU/Zin,其中ZinXLXCR XC&#xff1a;表示为容抗 XL&#xff1a;表示为感抗 R&#xff1a;表示为电阻阻值 特性 电感对越是高频的电流的阻力就会越大&#xff0c;对越是低频的电流的阻力就会越小&#xff0c;感抗的大小是与频率是息息相关的&#xff0c;并且可简单…

Spring事务管理与模板对象

1.事务管理 1.事务回顾 事务指数据库中多个操作合并在一起形成的操作序列 事务的作用 当数据库操作序列中个别操作失败时&#xff0c;提供一种方式使数据库状态恢复到正常状态&#xff08;A&#xff09;&#xff0c;保障数据库即使在异常状态下仍能保持数据一致性&#xff…

时钟显示 html JavaScript

sf.html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>时间</title><script>function showTime(){var timenew Date();var datetime.getDate();var yeartime.getFullYear();var monthtime.getMonth()1;var …

DataGrip 连接 Centos MySql失败

首先检查Mysql是否运行&#xff1a; systemctl status mysqld &#xff0c; 如果显示没有启动则需要启动mysql 检查防火墙是否打开&#xff0c;是否打开3306的端口 sudo firewall-cmd --list-all 如果下面3306没有打开则打开3306端口 publictarget: defaulticmp-block-inver…

推荐书籍《低代码平台开发实践:基于React》—— 提升开发效率,构建优质应用

写在前面 随着数字化转型的深入&#xff0c;企业对应用开发效率和灵活性的要求不断提高。低代码平台作为新兴的软件开发方式&#xff0c;通过可视化界面和预构建组件&#xff0c;极大简化了应用开发流程&#xff0c;降低了技术门槛。基于React的低代码平台以其组件化、响应式和…

解决MySQL 5.7在Redhat 9中启动报错:libncurses.so.5和libtinfo.so.5缺失问题

在使用Linux系统搭建MySQL数据库的过程中&#xff0c;我们往往会遇到各种依赖库的问题&#xff0c;尤其是在安装较旧版本的MySQL时。最近&#xff0c;在RedHat 9&#xff08;rocky linux 9&#xff09;系统上安装MySQL 5.7版本时&#xff0c;我遇到了一个典型的依赖库缺失错误&…

动态规划(算法竞赛、蓝桥杯)--状态压缩DP蒙德里安的梦想

1、B站视频链接&#xff1a;E31 状态压缩DP 蒙德里安的梦想_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N12,M1<<N; bool st[N];//st[i]存储合并列的状态i是否合法 long long f[N][M];//f[i][j]表示摆放第i列&#xff0c;状态为…

常用“树”数据结构

哈夫曼树 在许多应用中&#xff0c;树中结点常常被赋予一个表示某种意义的数值&#xff0c;称为该结点的权。从树的根到任意结点的路径长度(经过的边数)与该结点上权值的乘积&#xff0c;称为该结点的带权路径长度。树中所有叶结点的带权路径长度之和称为该树的带权路径长度&am…

有没有无损格式转换mp3的方法?

随着数字音乐的发展&#xff0c;无损音乐格式如FLAC、APE、WAV等越来越受到音乐爱好者的青睐。无损音乐保证了音乐在传输和存储过程中不损失任何原始信息&#xff0c;从而保留了音乐的原汁原味。但有时&#xff0c;出于设备兼容性、空间节省或其他原因&#xff0c;我们可能需要…

C语言项目实战——贪吃蛇

C语言实现贪吃蛇 前言一、 游戏背景二、游戏效果演示三、课程目标四、项目定位五、技术要点六、Win32 API介绍6.1 Win32 API6.2 控制台程序6.3 控制台屏幕上的坐标COORD6.4 GetStdHandle6.5 GetConsoleCursorInfo6.5.1 CONSOLE_CURSOR_INFO 6.6 SetConsoleCursorInfo6.7 SetCon…

Ubuntu/Linux系统下Redis的基本操作命令

版本查询 redis-server --version # 或者redis-server -v 如上图所示&#xff0c;redis-server的版本为6.0.9,证明redis已经安装完成。 启动Redis服务 启动命令如下&#xff1a; redis-server启动成功如下所示&#xff1a; 启动过程中遇到如下问题时&#xff0c;杀死指定端…

Python Web开发记录 Day6:MySQL(关系型数据库)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 六、MySQL1、MySQL-概述和引入①MySQL是什么&am…

阿里云几核服务器够用?内存多少合适?

阿里云服务器配置怎么选择&#xff1f;CPU内存、公网带宽和系统盘怎么选择&#xff1f;个人开发者或中小企业选择轻量应用服务器、ECS经济型e实例&#xff0c;企业用户选择ECS通用算力型u1云服务器、ECS计算型c7、通用型g7云服务器&#xff0c;阿里云服务器网aliyunfuwuqi.com整…

【论文精读】Mask R-CNN

摘要 基于Faster RCNN&#xff0c;做出如下改变&#xff1a; 添加了用于预测每个感兴趣区域(RoI)上的分割掩码分支&#xff0c;与用于分类和边界框回归的分支并行。mask分支是一个应用于每个RoI的FCN&#xff0c;以像素到像素的方式预测分割掩码&#xff0c;只增加了很小的计…

倒计时34天

L2-1 堆宝塔 - B107 2023级选拔春季开学测重现 (pintia.cn) #include<bits/stdc.h> using namespace std; //#define int long long const int N2e56; const int inf0x3f3f3f3f; const double piacos(-1.0); vector<int>ve1,ve2; vector<vector<int> >…

推荐一个数据库脚本在线转换网站

由于各种数据库系统的功能、性能有差异&#xff0c;往往不同的项目会选用不同的数据库系统。同时&#xff0c;由于sql语法之间存在细微的差异&#xff0c;之前项目的脚本&#xff0c;就需要修改&#xff0c;并重新进行调试。鉴于这个出发点向大家推荐一个sql脚本转换的在线网站…

STM32 | 零基础 STM32 第一天

零基础 STM32 第一天 一、认知STM32 1、STM32概念 STM32:意法半导体基于ARM公司的Cortex-M内核开发的32位的高性能、低功耗单片机。 ST:意法半导体 M:基于ARM公司的Cortex-M内核的高性能、低功耗单片机 32&#xff1a;32位单片机 2、STM32开发的产品 STM32开发的产品&a…

Scikit-Learn逻辑回归

Scikit-Learn逻辑回归 1、逻辑回归概述1.1、逻辑回归1.2、逻辑回归的优缺点1.3、逻辑回归与线性回归2、逻辑回归的原理2.1、逻辑回归的概念与原理2.2、逻辑回归的损失函数2.3、梯度下降法求解逻辑回归的最优解3、Scikit-Learn逻辑回归3.1、决策边界3.2、Scikit-Learn逻辑回归AP…