ES6~ES11

一、ECMASript 6 新特性

let 关键字

  • let 关键字用来声明变量,用来 let 声明的变量有几个特点:

1、不允许重复声明

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5A3oAfNe-1678617402356)(D:\01_Software\03-markdownImages\image-20230115094535324.png)]

2、块级作用域

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IE1iv8Ap-1678617402357)(D:\01_Software\03-markdownImages\image-20230115094554126.png)]

3、不存在变量提升

4、不影响作用域链

//1、不允许重复声明
let start = "罗志祥";
let start = "小猪";//2、块级作用域 全局 函数 eval
if else while for
{let girl = '周扬青';
}
console.log(girl);//3、不存在变量提升
console.log(song);
let song  = '恋爱达人';//4、不影响作用域链
{let school = '尚硅谷';function fn(){console.log(school);}fn();
}

应用场景:以后声明变量使用 let 就对了

let items = document.querySelectAll(".item");
for(let i = 0; i < items.length; i++){items[i].addEventListener("click",function(){items[i].style.background = "pink";  })
}

const 定义常量

1、一定要付初始值

2、潜规则:一般常量使用大写

3、常量值不能修改

4、块级作用域

变量的解构赋值

1、数据的解构

const F4 = {'小沈阳','刘能','找死','王五'}
let {xiao, liu, zhao, song} = F4;
console.log(xiao);
console.log(liu);
console.log(zhao);
console.log(song);

2、对象的接构

const zhao = {name: '赵本山',age: '不详',xiaopin: function(){console.log("小品");}
}
let {name, age} = zhao;
console.log(name);
console.log(age);let {xiaopin} = zhao;
xiaopin();

模板字符串

1、可以直接出现换行符

let str = `<ul><li>刘翔</li><li>苏炳添</li></ul>`;

2、变量拼接

let lovest = '魏翔';
let out = `${lovest}是我心目中最喜欢的演员`;

简化对象写法

旧版本

var school = {name: '沈腾',xiaopin: function(){console.log('小品');}
}

新版本

  • 如果外部变量跟内部变量的名称一样则可以直接省略
let name = 'summer';
let change = function(){console.log("alksdjflkajds");
}
let hahah = {name,change,improve(){console.log("klajsdfkljjhadsf");}
}

箭头函数

1、this 是静态的:this 始终指向函数声明时所在作用域下的 this 的数值

  • call 方法可以修改 this 的指向
function getName(){console.log(this.name);
}
let getName2 = () => {console.log(this.name);
}
window.name = '尚硅谷';
const school = {name: "ATGUIGU"
}
//直接调用
getName();
getName2();
//结果:
尚硅谷
尚硅谷//call 方法调用
getName.call(school);
getName2.call(school);
//结果:
ATGUIGU
尚硅谷

2、不能作为构造实例化对象

let Person = (name, age) => {this.name = name;this.age = age;
}
let me = new Person('xiaoming', 30);
console.log(me);

3、不能使用 arguments 变量

4、箭头函数的简写

  • 省略小括号,当形参有且只有一个的时候
  • 省略花括号,当代码只有一条代码的时候
//1) 省略小括号
let add = n => {return n + n;
}
console.log(add(9))//2)省略花括号
let add = n => return n * n;
console.log(add(9));

应用场景

1、点击 div 2s 后颜色变成粉色

错误示范:定时器的this是指向window的

var div = document.querySelect("div");
div.addEventListener('click',function(){Interview(function(){this.style.background = 'pink';},2000)
})

1)正确示范:保存this

var div = document.querySelect("div");
div.addEventListener('click',function(){let _this = this;Interview(function(){_this.style.background = 'pink';},2000)
})

2)正确示范:箭头函数

  • 它是指向声明时所在作用域下的 this 数值
var div = document.querySelect("div");
div.addEventListener('click',function(){Interview(() => {this.style.background = 'pink';},2000)
})

2、从数组中返回偶数的元素

旧版本

const arr = [1,6,8,9,6,4,3];
const result = arr.filter(function(item){if(item % 2 === 0){return true;}else{return fasle;}
})

新版本

const arr = [1,6,8,9,6,4,3];
const result = arr.filter(item => item % 2 === 0);

形参初始值

1、形参初始值 具有默认的参数,一般位置要靠后(潜规则)

function add(a,b,c = 10){return a + b + c;
}
let result = add(1,2);
console.log(result);
//13;

2、与解构赋值结合

function connect({host="127.0.0.1", username, password, port}){console.log(host);console.log(username);console.log(password);console.log(port);
}
connect({host: 'atguigu.com',username: 'root',password: 'root',port: 3305
})
//atguigu.com
//root
//root
//3305

rest 形参

1、rest 参数必须要放参数最后面

2、rest 参数是以数组的方式返回的

function fn(a, b, ...args){console.log(a);console.log(b);console.log(args);
}
fn(1,2,3,4,5,6)

扩展运算符

  • 【…】 扩展运算符能将 【数组】转换为逗号分隔的【参数序列】
  • 扩展运算符是放在实参里面的
const tfboys = ['易烊千玺', '王俊凯', '王源'];function chunwan(){console.log(arguments);
}
chunwan(...tfboys);

使用场景

1、数组的合并

const kuaizi = ['王太利', '小样'];
const fenghuang = ['曾毅', '菱花'];
//1、函数合并
const hebing = kuaizi.concat(fenghuang);
//2、第二种
const hebing = [...kuaizi, ...fenghuang];

2、数组的克隆

  • 如果拷贝的元素有引用类型,则是浅拷贝
const sanzhihua = ['E', 'G', 'M'];
const sanyecao = [...sanzhihua];
console.log(sanyecao) //['E', 'G', 'M']

3、将伪数组转为真正的数组

const divs = document.querSeletorAll('div');
const divArr = [...divs];
console.log(divArr)

Symbol

  • ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值。它是JavaScript 语言的第七种数据类型,是一种类似于字符串的数据类型。

Symbol 特点

  1. Symbol 的值是唯一的,用来解决命名冲突的问题

  2. Symbol 值不能与其他数据进行运算

  3. Symbol 定义 的 对象属 性 不能 使 用 for…in 循 环遍 历 ,但 是可以使用Reflect.ownKeys 来获取对象的所有键名

七种数据类型(USONB)

1、u:undefined

2、s:string symbol

3、o:object

4、n:null number

5、b:boolean

//创建 symbol
let s = Symbol();let s3 = Symbol('尚硅谷');
let s4 = Symbol('尚硅谷');
console.log(s2 === s3) // falselet s3 = Symbol.for('尚硅谷');
let s4 = Symbol.for('尚硅谷');
console.log(s2 === s3) // true

注:遇到唯一性的场景就要想到 Symbol

Symbol 创建对象属性

第一种方法

let game = {up(){console.log("up");} down(){console.log("down")}
}//声明对象
let methods = {up: Symbol();down:Symbol();
}//添加属性
game[methdos.up] = function(){console.log("我可以改变形状");
}
game[methods.down] = function(){console.log("我可以快速下降");
}

第二种方法

let youxi = {name: "狼人杀",[Symbol("say")]: function(){console.log("天黑请闭眼")},[Symbol('zibao')]: function(){console.log("我可以自爆");}
}

Symbol 内置值

方法 说明
Symbol.hasInstance 当其他对象使用 instanceof 运算符,判断是否为该对
Symbol.isConcatSpreadable 对象的 Symbol.isConcatSpreadable 属性等于的是一个
Symbol.species 创建衍生对象时,会使用该属性
Symbol.match 当执行 str.match(myObject) 时,如果该属性存在,会
Symbol.replace 当该对象被 str.replace(myObject)方法调用时,会返回
Symbol.search 当该对象被 str.search (myObject)方法调用时,会返回
Symbol.split 当该对象被 str.split(myObject)方法调用时,会返回该
Symbol.iterator 对象进行 for…of 循环时,会调用 Symbol.iterator 方法,
Symbol.toPrimitive 该对象被转为原始类型的值时,会调用这个方法,返
Symbol. toStringTag 在该对象上面调用 toString 方法时,返回该方法的返回值
Symbol. unscopables 该对象指定了使用 with 关键字时,哪些属性会被 with 环境排除
//Symbol.hasInstance
class Person{static [Symbol.hasInstance](param){console.log(param);console.log("我是被用来检查类型的");return fasle;}
}let o = {};
console.log(o instanceof Person); // false//Symbol.isConcatSpreadable
const arr = [1, 2, 3];
const arr2 = [4,5,6];
console.log(arr.concat(arr2)); // [1,2,3,4,5,6];const arr = [1, 2, 3];
const arr2 = [4,5,6];
arr2[Symbol.isConcatSpreadable] = false;
console.log(arr.concat(arr2)); // [1,2,3,Array(3)];

迭代器

  1. ES6 创造了一种新的遍历命令 for…of 循环,Iterator 接口主要供 for…of 消费

  2. 原生具备 iterator 接口的数据(可用 for of 遍历)

  • a) Array

  • b) Arguments

  • c) Set

  • d) Map

  • e) String

  • f) TypedArray

  • g) NodeList

  1. 工作原理
  • a) 创建一个指针对象,指向当前数据结构的起始位置

  • b) 第一次调用对象的 next 方法,指针自动指向数据结构的第一个成员

  • c) 接下来不断调用 next 方法,指针一直往后移动,直到指向最后一个成员

  • d) 每调用 next 方法返回一个包含 value 和 done 属性的对象

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

//声明一个数组
const xiyou = ['唐僧', '孙悟空', '猪八戒', '沙僧'];let iterator = xiyou[Symbol.iterator]();console.log(iterator.nect());
console.log(iterator.nect());
console.log(iterator.nect());
console.log(iterator.nect());
console.log(iterator.nect());

自定义迭代器

const banji = {name: "终极一般",stus: ['xiaoming','xiaoning','xiaotian','knight'],[Symbol.iterator](){let intdex = 0;let _this = this;return {next: function(){if(index < _this.stus.length){const result = {value: _this.stus[i], done: false;index++;return result;}else{return {value: undefined, done: true}}}}};}
}

生成器

代码说明:

  1. *的位置没有限制

  2. 生成器函数返回的结果是迭代器对象,调用迭代器对象的 next 方法可以得到yield 语句后的值

  3. yield 相当于函数的暂停标记,也可以认为是函数的分隔符,每调用一次 next方法,执行一段代码

  4. next 方法可以传递实参,作为 yield 语句的返回值

function * gen(){yield '一只没有耳朵';yield '一只没有尾巴';return '真奇怪';
}
let iterator = gen();
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());

生成器函数参数

function * gen(arg){console.log(arg);let one =  yield '一只没有耳朵';console.log(one);let two =  yield '一只没有尾巴';console.log(two);
}
let iterator = gen('AAA');
console.log(iterator.next());
console.log(iterator.next('BBB'));//结果
//AAA
//BBB

生成器实例(1)

  • 实现异步任务的功能

旧版本

setTimeout(() => {console.log(111);setTimeout(() => {console.log(222);setTimeout(() => {console.log(333);},3000)},2000)
},1000)

新版本

function one(){setTimeout(() => {console.log(111);iterator.next();})
}
function two(){setTimeout(() => {console.log(222);iterator.next();})
}
function three(){setTimeout(() => {console.log(333);iterator.next();})
}
function * gen(){yield one();yield two();yield three();
}
let iterator = gen();
iterator.next();

生成器实例(2)

  • 用户数据、订单数据、商品数据
function one(){setTimeout(() => {let data = "用户数据";iterator.next(data);})
}
function two(){setTimeout(() => {let data = "订单数据";iterator.next(data);})
}
function three(){setTimeout(() => {let data = "商品数据";iterator.next(data);})
}
function * gen(){let one = yield one();console.log(one);yield two();let two = console.log(two);let three = yield three();console.log(three);
}
let iterator = gen();
iterator.next();

Set 集合

  • ES6 提供了新的数据结构 Set(集合)。它类似于数组,但成员的值都是唯一的,集合实现了 iterator 接口,所以可以使用『扩展运算符』和『for…of…』进行遍历,集合的属性和方法:
  1. size

返回集合的元素个数

  1. add

增加一个新元素,返回当前集合

  1. delete

删除元素,返回 boolean 值

  1. has

检测集合中是否包含某个元素,返回 boolean 值

  1. clear

清空集合,返回 undefined

//声明变量
let s = new Set();
let s2 = new Set(['哈哈哈', '嘻嘻嘻'])//遍历
for(var v of s2){console.log(v);
}

使用场景

let arr = [1,2,3,4,5,6,7];//1、去重
let result = [...new Set(arr)];//2、交集
let arr2 = [4,5,6,7];
let result = [...new Set(arr)].filter(item => {let ar2 = new Set(arr2);if(ar2.has(item)){return true;}else{return fasle;}
})let result = [...new Set(arr)].filter(item => new Set(arr2).has(item));//3、并集
let result = [...new Set([...arr, ...arr2])];//4、差集
let result = [...new Set(arr)].filter(!item => new Set(arr2).has(item));

Map 集合

  • ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合。但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。Map 也实现了iterator 接口,所以可以使用『扩展运算符』和『for…of…』进行遍历。Map 的属性和方法:
  1. size

返回 Map 的元素个数

  1. set

增加一个新元素,返回当前 Map

  1. get

返回键名对象的键值

  1. has

检测 Map 中是否包含某个元素,返回 boolean 值

  1. clear

清空集合,返回 undefined

Class 类

class Phone{constructor(brand,price){this brand = brand;this.price = price;}call(){console.log("正在拨打电话");}
}
let onePlus = new Phone("1+",1999);
console.log(onePlus);

Class 静态成员

  • 实例化对象和静态成员的属性是不相通的
//可以通过 Phone.prototype.call 给类添加静态成员变量
class Phone{static name = '手机';static change(){console.log("我可以改变世界");}
}
let nokia = new Phone();
console.log(nokia); // undefined
console.log(Phone.name) // 手机

Class 继承

class Phone {constructor(brand, price){this.brand = brand;this.price = price;}call(){console.log('我可以打电话哦');}
}class SmartPhone extends Phone {constructor(brand, price, size, color){super(brand, price);this.size = size;this.color = color;}phone(){console.log("我是手机");}
}

Class 重写

  • 子类不能调用父类的成员方法的
class Phone {constructor(brand, price){this.brand = brand;this.price = price;}call(){console.log('我可以打电话哦');}
}class SmartPhone extends Phone {constructor(brand, price, size, color){super(brand, price);this.size = size;this.color = color;}phone(){console.log("我是手机");}//重写call(){console.log("重写方法");}
}

get 和 set

class Phone{get price(){return "i love you";}set price(newVal){}
}
let s = new Phone();
s.price = "free";

数值扩展

1、Number.EPSILON 是 JavaScript 表示最小精度

function equal(a, b){if(Math.abs(a - b) < Number.EPSILON){return true;}else{return false;}
}

2、二进制和八进制

let b = 0b1010;
let o = 0o777;
let d = 100;
let x = 0xff;

3、Number.isNaN 检测一个数值是否是 NaN

Number.isNaN(123);
//true;

4、Number.parseInt Number.parseFloat字符串整数

  • 如果有字符串则直接截断

5、Number.isInteger 判断一个数是否是整数

6、Math.trunc 将数字的小数部门抹掉

7、Math.sign 如果为正数返回 1 如果是负数返回 -1 如果是零返回 0

8、Number.isFinite 检查一个数值是否为有限数

对象方法扩展

1、Object.is 判断两个数值是否完全相等(类似全等)

console.log(123 === 123); // true
console.log(Object.is(123,123)) // true
console.log(NaN === NaN) // false;
console.log(Object.is(NaN, NaN)) // true;

2、Object.assign 对象的合并

  • 会将 config1 没有属性的追加
  • 如果参数重属性,以 config1 为准
const config1 = {host: 'localhost',prot: 3306,name: 'root',pass: 'root'
};
const config2 = {host: 'localhost',prot: 3306,name: 'root',pass: 'root',test: 'asdf'
}

3、Object.setPrototypeOf、Object.getPrototypeOf

  • 设置原型,设置对象
const school = {name: '尚硅谷'
}
const cities = {xiaoqu: ['北京', '深圳']
}
Object.setPrototypeOf(school, cities);

模块化

引入模块数据方式一

1、模块化的好处

模块化的优势有以下几点:

  • 防止命名冲突

  • 代码复用

  • 高维护性

2、模块化规范产品

ES6 之前的模块化规范有:

  • CommonJS => NodeJS、Browserify

  • AMD => requireJS

  • CMD => seaJS

3、ES6模块化语法

模块功能主要由两个命令构成:export 和 import。

  • export 命令用于规定模块的对外接口

  • import 命令用于输入其他模块提供的功能

m1.js

export let school = '尚硅谷';export function teach() {console.log("我们可以教你开发技能");
}

m2.js

let school = '尚硅谷';function teach() {console.log("我们可以教你开发技能");
}
export {school, teach};

m2.js

export default {school: 'atguigu',change: function(){console.log("我们可以改变你")   }
}

index.html

<script type = "module">//1、通用的导入方式import * as m1 from "./src/js/m1.js";import * as m2 from "./src/js/m2.js";import * as m3 from "./src/js/m3.js";m3.default.change();//2、解构赋值的形式import {school, teach} from "./src/js/m1.js";import {school as guigu, teach} from "./src/js/m2.js";import {default as m3} from "./src/js/m3.js"//3、渐变形式 针对默认暴露import m3 from "./src/js/m3.js";
</script>

引入模块数据方式二

app.js

//模块引入
import * as m1 from "./m1.js";
import * as m1 from "./m2.js";
import * as m1 from "./m3.js";

index.html

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

bable对ES6模块化代码转换

1、初始化 npm init —yes

2、开发依赖 npm i babel-cli babel-preset-env browserify -D

3、npx babel src/js -d dist/js --presets=babel-preset-env

4、打包 npx browserify dist/js/app.js -o dist/bundle.js

引入NPM包

1、安装 jquery 包:npm i jquery

import $ from 'jquery';
${'body'}.css('background,''pink');

og(“我们可以改变你”)
}
}


**index.html**```html
<script type = "module">//1、通用的导入方式import * as m1 from "./src/js/m1.js";import * as m2 from "./src/js/m2.js";import * as m3 from "./src/js/m3.js";m3.default.change();//2、解构赋值的形式import {school, teach} from "./src/js/m1.js";import {school as guigu, teach} from "./src/js/m2.js";import {default as m3} from "./src/js/m3.js"//3、渐变形式 针对默认暴露import m3 from "./src/js/m3.js";
</script>

引入模块数据方式二

app.js

//模块引入
import * as m1 from "./m1.js";
import * as m1 from "./m2.js";
import * as m1 from "./m3.js";

index.html

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

bable对ES6模块化代码转换

1、初始化 npm init —yes

2、开发依赖 npm i babel-cli babel-preset-env browserify -D

3、npx babel src/js -d dist/js --presets=babel-preset-env

4、打包 npx browserify dist/js/app.js -o dist/bundle.js

引入NPM包

1、安装 jquery 包:npm i jquery

import $ from 'jquery';
${'body'}.css('background,''pink');

06-ES6ES11相关推荐

  1. 一幅长文细学JavaScript(五)——ES6-ES11新特性

    5 ES版本 摘要 ES5的先天不足致使ES后续版本的发展,这也是前端人员绕不开的一个点.如果我们想要在工作和面试中轻松解决问题,那么了解ES6-ES11是必不可少的. 在本文中,我将采用一种更加通俗 ...

  2. 06 面向对象之:反射,双下方法

    一.反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语 ...

  3. 【跃迁之路】【495天】程序员高效学习方法论探索系列(实验阶段252-2018.06.15)...

    @(跃迁之路)专栏 实验说明 从2017.10.6起,开启这个系列,目标只有一个:探索新的学习方法,实现跃迁式成长 实验期2年(2017.10.06 - 2019.10.06) 我将以自己为实验对象. ...

  4. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论

    Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...

  5. 【跃迁之路】【425天】刻意练习系列184—SQL(2018.04.06)

    @(跃迁之路)专栏 叨叨两句 技术的精进不能只是简单的刷题,而应该是不断的"刻意"练习 该系列改版后正式纳入[跃迁之路]专栏,持续更新 刻意练习--MySQL 2018.04.02 ...

  6. OD使用教程6 - 调试篇06|解密系列

    OD使用教程6 - 调试篇06 让编程改变世界 Change the world by program   这一讲开始,小甲鱼带大家接触真正程序的逆向.其实也没啥大不了的,也就是对之前所学的知识进行巩 ...

  7. 【青少年编程】【Scratch】06 侦测模块

    06 侦测模块 侦测模块是用来检测场景中某一参数的变化,通过参数变化来为下一步操作提供运行依据.通常与控制模块中的条件语句和循环语句一起使用. 具体分为: 与运动相关的侦测: 与按键相关的侦测: 侦测 ...

  8. 06 Scratch等级考试(一级)模拟题

    Scratch竞赛交流群已成立(适合6至18周岁的青少年),公众号后台回复[Scratch],即可进入.如果加入了之前的社群不需要重复加入. 微信后台回复"资料下载"可获取以往学习 ...

  9. 数据结构与算法:06 线性表

    06 线性表 知识结构: 1. 线性表的定义与操作 1.1 线性表的定义 线性表(Linear List)是由n(n≥0)n (n≥0)n(n≥0)个相同类型的数据元素a0,a1,⋯,an−1a_0, ...

  10. linux深度定制,Linux Deepin 12.06 beta1 发布

    反馈如下: 1) Linux Deepin 12.06 beta1 中文简体和繁体版本,默认安装后,主题有点问题,即默认的Metacity左上角的菜单背景色与文字的颜色都是白色,只有鼠标移经过时高亮才 ...

最新文章

  1. 自动化测试工具Cucumber的简单介绍
  2. 【linux开发】IO端口和IO内存的区别及分别使用的函数接口
  3. NYOJ-172 小珂的图表
  4. Linux 系统应用编程——出错处理(errno)
  5. 论文浅尝 | KGAT: 用于推荐的知识图注意力网络
  6. jenkins docker 自动部署 构建_Docker_Jenkins自动部署项目
  7. 03.基于测试开发讲解和Cobertura框架介绍
  8. AudioSwitcher for mac(音频控制工具)v3.08 版本支持M1芯片
  9. 华为服务器sn码查询网站,linux 查询服务器sn号
  10. Matplotlib:线类型
  11. Decorate 模式
  12. python 3 过滤股票
  13. java word 批注_Java 添加Word批注(文本、图片)
  14. mac qq 用户信息文件夹
  15. windows电影杀毒linux程序,两部Linux有关的电影:《操作系统革命》《代码》
  16. python ipo模式包括什么_什么是IPO?
  17. antdvue upload组件的customRequest自定义上传事件一直uploading处理方法
  18. English语法_不定式 - 常用句型
  19. Xshell登录后自动执行命令
  20. DARTS论文和算法解析

热门文章

  1. Spring IoC容器与Bean管理
  2. 带动猜你喜欢流量的方法,,如何给新品打标,使得新品快速入池猜你喜欢
  3. mysql命令行方式导入sql文件
  4. Arduino IDE环境下WeMoS D1mini引脚定义和映射
  5. centos 查看mysql版本_centos如何查看版本
  6. 移动硬盘文件或目录损坏且无法读取,这样做就对了!
  7. PostgreSQL Substring字符串截取函数
  8. Java设计模式作业-责任链模式
  9. Gears of Programmer--工作
  10. 【转】天然嫩肤法 几乎没人知道