ECMAScript6

课程链接

目录

  • 相关介绍
    • 什么是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.rhkb.cn/news/269524.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

光影交织:汽车穿越隧道的视觉盛宴

在繁忙的城市中&#xff0c;隧道成为了连接两端的重要通道。而对于汽车来说&#xff0c;穿越隧道不仅是一次简单的空间转移&#xff0c;更是一场融合了视觉、技术与安全的独特体验。 当汽车缓缓驶入隧道&#xff0c;外界的光线逐渐减弱&#xff0c;隧道内部的光线开始发挥作用。…

向量数据库Chroma教程

引言 随着大模型的崛起,数据的海洋愈发浩渺无垠。受限于token的数量,无数的开发者们如同勇敢的航海家,开始在茫茫数据之海中探寻新的路径。他们选择了将浩如烟海的知识、新闻、文献、语料等,通过嵌入算法(embedding)的神秘力量,转化为向量数据,存储在神秘的Chroma向量…

JavaScript基础知识(三)

JavaScript基础知识&#xff08;三&#xff09; 一、事件1. 事件绑定2.事件流2.1 事件捕获与事件冒泡 3.事件对象扩展3.1 阻止事件冒泡3.2 事件默认行为 4.事件委托5.事件类型5.1 鼠标事件5.2 键盘事件5.3 触屏事件 二、计时器方法1. setInterval 与 clearInterval2. setTimeou…

【Unity】使用ScriptableObject存储数据

1.为什么要用ScriptableObject&#xff1f; 在游戏开发中&#xff0c;有大量的配置数据需要存储&#xff0c;这个时候就需要ScriptableObject来存储数据了。 很多人会说我可以用json、xml、txt&#xff0c;excel等等 但是你们有没有想过&#xff0c;假设你使用的是json&#x…

LeetCode148.排序链表

题目 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5] 输入&#xff1a;head [] 输出&#xff1a;[] 思路…

通过GitHub探索Python爬虫技术

1.检索爬取内容案例。 2.找到最近更新的。(最新一般都可以直接运行) 3.选择适合自己的项目&#xff0c;目前测试下面画红圈的是可行的。 4.方便大家查看就把代码粘贴出来了。 #图中画圈一代码 import requests import os import rewhile True:music_id input("请输入歌曲…

openGauss学习笔记-236 openGauss性能调优-SQL调优-Query执行流程

文章目录 openGauss学习笔记-236 openGauss性能调优-SQL调优-Query执行流程236.1 Query执行流程236.1.1 调优手段之统计信息236.1.2 调优手段之GUC参数236.1.3 调优手段之底层存储236.1.4 调优手段之SQL重写 openGauss学习笔记-236 openGauss性能调优-SQL调优-Query执行流程 S…

Java 解决异步 @Async 失效问题

1.问题描述 使用Async进行异步处理时&#xff0c;异步没有生效 2.原因分析 经过排查后发现是因为使用Async的方法没有跨2个Service导致的 错误示例 控制器接口 > 直接调用 custAdminService.importCBuy() 3.解决方案 Controller接口不变&#xff0c;多添加一层Service&a…

【python开发】网络编程(上)

这里写目录标题 一、必备基础&#xff08;一&#xff09;网络架构1、交换机2、路由器3、三层交换机4、小型企业基础网络架构5、家庭网络架构6、互联网 &#xff08;二&#xff09;网络核心词汇1、子网掩码和IP2、DHCP3、内网和公网IP4、云服务器5、端口6、域名 二、网络编程案例…

大数据分析课----实时更新

1&#xff1a;Anaconda3 windows 安装 &#xff1a; 去官网下载&#xff1b; 然后安装好直接点next 点 i agree&#xff1b; 自己的电脑选第一个&#xff1b;学校的话选All Users &#xff1b; 选择自己存放的目录&#xff1b; 选前三个&#xff1b; 安装即可&#xff1b; 一直…

UE4 Niagara 关卡3.4官方案例解析

Texture sampling is only supported on the GPU at the moment.(纹理采样目前仅在GPU上受支持) 效果&#xff1a;textures can be referenced within GPU particle systems。this demo maps a texture to a grid of particles&#xff08;纹理可以在GPU粒子系统中被引用这个演…

牛客网C++专项题目整理(1)

1. 若有定义语句:char s[3][10],(*k)[3],*p;则以下赋值语句错误的是 1.p s; 2.p k; 3.p s[0]; 4.k s; 答案&#xff1a;124 char s[3][10] s 是数组指针&#xff0c;类型为char (*)[3]&#xff0c;所指向的每个数组长度为10; char (*k)[3] k是一个数组指针&a…

【C++庖丁解牛】初始化列表 | Static对象 | 友元函数

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1. 再谈构造函数1.1 …

小程序常用样式和组件

常用样式和组件 1. 组件和样式介绍 在开 Web 网站的时候&#xff1a; 页面的结构由 HTML 进行编写&#xff0c;例如&#xff1a;经常会用到 div、p、 span、img、a 等标签 页面的样式由 CSS 进行编写&#xff0c;例如&#xff1a;经常会采用 .class 、#id 、element 等选择器…

【计算机网络】TCP 如何实现可靠传输

TCP通过三次握手建立连接&#xff0c;四次挥手释放连接&#xff0c;确保连接建立和连接释放的可靠。 序列号、检验和、确认应答信号、重发机制、连接管理、窗口控制、流量控制、拥塞控制 标准回答 可靠传输就是通过TCP连接传送的数据是没有差错、不会丢失、不重复并且按序到达的…

React之数据绑定以及表单处理

一、表单元素 像<input>、<textarea>、<option>这样的表单元素不同于其他元素&#xff0c;因为他们可以通过用户交互发生变化。这些元素提供的界面使响应用户交互的表单数据处理更加容易 交互属性&#xff0c;用户对一下元素交互时通过onChange回调函数来监听…

【李沐论文精读】GAN精读

论文&#xff1a;Generative adversarial nets 参考&#xff1a;GAN论文逐段精读、生成对抗网络、李沐视频精读系列 一、介绍 什么是GAN? GAN(Generative adversarial network&#xff0c;生成对抗网络&#xff09;&#xff0c;它由生成器G&#xff08;Generator Neural Netwo…

持安科技孙维伯:零信任在攻防演练下的最佳实践|DISCConf 2023

近日&#xff0c;在2023数字身份安全技术大会上&#xff0c;持安科技联合创始人孙维伯应主办方的特别邀请&#xff0c;发表了主题为“零信任在攻防演练下的最佳实践”的演讲。 孙维伯在2023数字身份安全技术大会上发表演讲 以下为本次演讲实录&#xff1a; 我是持安科技的联合…

二百二十六、Linux——shell脚本查看今天日期、昨天日期、30天前日期、1月前日期

一、目的 由于磁盘资源有限&#xff0c;因为对原始数据的保存有事件限制&#xff0c;因为对于超过一定期限的数据文件则需要删除&#xff0c;要实现定期删除则第一步就是查看日期时间 二、在Linux中创建shell脚本 #! /bin/bash source /etc/profile nowdatedate --date0 da…

计算机系统缺少cv100.dll文件解决方法(最新)

cv100.dll 是一个Windows操作系统中的动态链接库&#xff08;DLL&#xff09;文件。DLL文件是包含可由多个程序共享的代码和数据的模块&#xff0c;以减少磁盘空间占用并提高系统性能。根据收集到的信息&#xff0c;cv100.dll 文件可能与图像处理、计算机视觉相关的功能有关。 …