简介
1)ES全称ECMAScript,是脚本语言的规范,而平时经常编写的js,是es的一种实现,所以es新特性其实指的就是js的新特性
2)ECMA(European Coumputer Manufacturers Association):中文名称为欧洲计算机制造商协会,这个组织的目标是评估、开发和认可电信和计算机标准、1964年后该组织改名为Ecma国际
3)ECMAScript:是由Ecma国际通过ECMA-262标准化的脚本程序设计语言
ES6
ES6兼容性查看
ECMAScript 6 compatibility table
let
和var一样使用,如:
let a; let a,b,c; let a = 100; let a = 100,b = '我';c = [];
注意:
1)变量不能重复声明
let a = 100; let a = 200;//输出报错
2)块级作用域
{ let a = 100; } console.log(a);//输出未定义a
3)不存在变量提升
//会先把var a;提取上来 console.log(a);//输出undefined var a = 100; console.log(b);//输出报错 let b = 200;
4)不影响作用域链
let a = 10; function fn(){ console.log(a);//输出10 }; fn();
const
定义常量:值不能修改的量称为常量
const A = 100;
注意:
1)一定要赋初始值
const A;//报错
2)一般常量使用大写
3)常量值不能修改
const A = 100; A = 200;//报错
4)块级作用域
5)对数组和对象元素的修改,不算做对常量的修改,不会报错
const TEAM = ['UZI','MLXG','Ming','Letme']; TEAM.push('Xiaohu')//不会报错
变量解构赋值
ES6允许按照一定模式从数组和对象中提取值,对变量进行赋值。这被称为解构赋值
//数组的解构 const F4 = ['小沈阳','刘能','赵四','宋小宝']; let [xiao,liu,zhao,song] = F4; console.log(xiao);//输出小沈阳 console.log(liu);//输出刘能 console.log(zhao);//输出赵四 console.log(song);//输出宋小宝 //对象的解构 const Zhao = { name: '赵本山', age: '不详', xiaopin:function(){ console.log('我演小品'); } } let {name,age,xiaopin} = Zhao; console.log(name);//输出赵本山 console.log(age);//输出刘能 console.log(xiaopin);//输出ƒ () {console.log('我演小品');} xiaopin();//输出我演小品
模板字符串
ES6引入新的声明字符串的方式``
let str = `我是字符串`; console.log(str);//输出我是字符串
特点:
1)内容中可以直接出现换行符
let str = '我是一个一个一 个';//报错 let a = `你是一个一个一 个`;//不报错
2)变量拼接
let a = '旭旭宝宝'; let b = `${a}是个大潮种`; console.log(b);//输出旭旭宝宝是个大潮种
简化对象写法
ES6允许在大括号里面,直接写入变量和函数,作为对象的属性和方法
let a = '旭旭宝宝'; let b = function () { console.log('是个潮种'); }; const c = { a, b, improve(){};//是improve:function(){}的简写 }; console.log(c);//输出{a: '旭旭宝宝' , b: ƒ , improve: ƒ improve()}
箭头函数以及声明特点
ES6允许使用 => 定义函数
let fn = function(){}; //——可以简化为 let fn = () => {};
注意:
1)this是静态的。始终指向函数声明时所在作用域下的this的值。
function fn(){ console.log(this.name); }; let fn1 = () => { console.log(this.name); }; window.name = '我'; const School = { name:'你'; }; //直接调用 fn();//输出我 fn1();//输出我 //call方法调用 fn.call(School);//输出你 fn1.call(School);//输出我
2)不能作为构造函数实例化对象
let Person = (name,age) => { this.name = name; this.age = age; }; let me = new Person('xiao',30); console.log(me);//报错
3)不能使用arguments(保存实参)变量
let fn = () => { console.log(arguments); }; fn(1,2,3);//报错
4)箭头函数的简写
//1.省略小括号。当形参有且只有一个的时候 let add = n => { return n + n; }; console.log(add(9));//输出18 //2.省略大括号。当代码体只有一条语句的时候 //而且return必须省略,此时语句的执行结果就是函数的返回值 let pow = (n) =>n*n;//或let pow = n => n*n; console.log(pow(9));//输出81
箭头函数适合与this无关的回调。如:定时器、数组的方法回调
箭头函数不适合与this有关的回调。如:事件回调、对象的方法
箭头函数没有自己的this,只能指向外层的this
函数参数的默认值设置
ES6允许给函数参数(形参)赋值初始值
function add(a,b,c = 10){ return a + b + c; }; let result = add(1,2); console.log(result);//输出13
与解构赋值结合
function connect({host,username,password}){ console.log(host);//如果给host设置默认值,实参没有传值,则输出默认值。如果设置了默认值,实参也传递了值,则输出实参值 console.log(username); console.log(password); }; connect({ host:'localhost', username:'root', password:'root' });
rest参数
用于获取函数的实参,用来代替arguments
语法:...标识符
function fn(...args){ console.log(...args);//输出的为一个数组[1,2,3] }; fn(1,2,3);
rest参数必须放在参数最后
function fn(a,b,...args){ console.log(a);//输出1 console.log(b);//输出2 console.log(...args);//输出[3,4,5,6] } fn(1,2,3,4,5,6);
扩展运算符
...:能将数组转换为逗号分隔的参数序列
const xyj = ['唐三藏','孙悟空','猪八戒','沙和尚']; function qujing(){ console.log(arguments); }; qujing(...xyj);//等同于qujing('唐三藏','孙悟空','猪八戒','沙和尚'),输出为'唐三藏','孙悟空','猪八戒','沙和尚'
应用
//1.数组合并 const kz = ['肖央','王太利']; const fhcq = ['玲花','曾毅']; const hb = [...kz,...fhcq]; console.log(hb);//输出为['肖央','王太利','玲花','曾毅']
//2.数组克隆 const A = ['b','c','d']; const B = [...A]; console.log(B);//输出['b','c','d']
<!-- 3.将伪数组转为真数组 --> <div></div> <div></div> <div></div> <script> const divs = document.querySelectorAll('div'); console.log(divs);//输出结果为[div,div,div]类型为对象 const divArr = [...divs]; console.log(divArr);//输出结果为[div,div,div]类型为数组 </script>
Symbol
ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。是js语言的第七种数据类型,是一种类似于字符串的数据类型
数据类型:USONB ——you are so niubility U: undefined S: string symbol O: object N: null number B: bollean
//创建Symbol let s = Symbol(); console.log(s, typeof s);//输出Symbol() 'symbol' //还可以通过Symbol.for创建 let s = Symbol.for(); console.log(s, typeof s);//输出Symbol() 'symbol'
特点:
-
Symbol值是唯一的,用来解决命名冲突的问题
let s1 = Symbol('张三'); let s2 = Symbol('张三'); console.log(s1 === s2);//输出false let s3 = Symbol.for('张三'); let s4 = Symbol.for('张三'); console.log(s3 === s4);//输出true
-
Symbol值不能与其他数据类型进行运算
-
Symbol定义的对象属性不能使用for in循环遍历,但是可以使用Reflect.ownKeys来获取对象的所有键名
应用
//往对象中添加方法 let game = {}; let methods = { up:Symbol(), down:Symbol() } game[methods.up] = function(){ } game[methods.down] = function(){ } console.log(game);//输出{Symbol():f(),Symbol():f()} //对象名[对象名.键]——用来获取键名 //调用添加的函数 game[methods.up]()
//如果直接在对象里面添加Symbol,需要写在[里面]。如: let a = { [Symbol()]:function(){ } }
迭代器
迭代器(iterator)是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署iterator接口,就可以完成遍历操作
1)ES6创造了一种新的遍历命令for...of循环,iterator接口主要供for...of消费
let xyj = ['唐三藏','孙悟空','猪八戒','沙和尚'] for(let v of xyj){ console.log(v);//输出唐三藏,孙悟空,猪八戒,沙和尚 }
2)原生具备iterator接口的数据(可用for...of遍历)
-
Array
-
Arguments
-
Set
-
Map
-
String
-
TypedArray
-
NodeList
3)工作原理
-
创建一个指针对象,指向当前数据结构的起始位置
-
第一次调用对象的next方法,指针自动指向数据结构的第一个成员
-
接下来不断调用next方法,指针一直往后移,直到指向最后一个成员
-
每调用next方法返回一个包含value和done属性的对象
注:需要自定义遍历数据的时候,要想到迭代器
生成器
生成器函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同
生成器其实就是一个特殊的函数
function * gen(){ console.log(1) } let a = gen(); iterator.next();//输出1
函数中可以包含yield语句——函数代码的分隔符
function * gen(){ console.log(1); yield '一只没有耳朵'; console.log(2); yield '一只没有嘴巴'; console.log(3); yield '真奇怪'; console.log(4); } let iterator = gen(); iterator.next();//输出1 iterator.next();//输出2 iterator.next();//输出3 iterator.next();//输出4 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} //遍历 for(let v of gen()){ console.log(v); }
参数传递
next方法可以传入实参
function * gen(arg){ console.log(arg);//输出AAA,有输出必须有一个next方法 let one = yield 111; console.log(one);//输出BBB let two = yield 222; console.log(two);//输出CCC let three = yield 333; console.log(three);//输出DDD } let iterator = gen('AAA'); console.log(iterator.next());//输出{value: 111, done: false} console.log(iterator.next('BBB'));//输出{value: 222, done: false} console.log(iterator.next('CCC'));//输出{value: 333, done: false} console.log(iterator.next('DDD'));//输出{value: undefined, done: true}
Promise
Promise是ES6引入的异步编程的新解决方案。语法上Promise是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果
//实例化Promise对象 const p = new Promise(function(resolve,reject){ setTimeout(function(){ let data = '数据'; resolve(data);//成功 let err = '读取失败'; reject(err);//失败 },1000) }) //调用Promise对象的then方法 p.then(function(value){ console.log(value);//成功时返回结果——数据 },function(reason){ console.log(reason);//失败是返回结果——读取失败 })
then方法
调用then方法 then方法的返回结果是Promise对象,对象状态由回调函数的执行结果决定
-
如果回调函数中返回的结果是 非Promise 类型的数据,则状态为成功,返回值为对象成功的值
-
如果回调函数中返回的结果是 Promise 类型的数据,则状态为内部Promise状态
const p = new Promise((resolve,reject)=>{ setTimeout(=>{ resolve('数据'); },1000) }) const result = p.then(value => { console.log(value); //1.非Promise数据 return 111 //2.Promise数据 return new Promise((resolve,reject)=>){ resolve('ok');//内部为成功,返回也为成功 reject('error');//内部为失败,返回也为失败 }) },reason => { })
//链式调用 p.then(value=>{ },reason=>{ }).then(value=>{ },reason=>{ })
catch方法
const p = new Promise((resolve,reject)=>{ setTimeout(=>{ reject('出错!'); },1000) }) p.catch(function(reason){ console.log(reason);//输出 出错! })
set
ES6提供了新的数据结构Set(集合)。它类似于数组,但成员的值都是唯一的,集合实现了iterator接口,所以可以使用扩展运算符和for...of进行遍历
let s = new Set(['小事','大事','小事']) console.log(s);//输出{'小事','大事'}——自动去重
属性和方法
属性和方法 | 返回值 |
---|---|
size | 返回集合的元素个数 |
add | 增加一个新元素,返回当前集合,在元素后添加 |
delete | 删除元素,返回布尔值 |
has | 检测集合中是否包含某个元素,返回布尔值 |
clear | 清空集合 |
let s = new Set(['好事','小事','大事','小事']) console.log(s.size);//输出4 s.add('大好事');//输出{'好事','小事','大事','小事','大好事'} s.delete('大事');//输出{'好事','小事','小事','大好事'} s.has('大好事');//返回true s.has(1);//返回false s.clear; //for of遍历 let s = new Set(['好事','小事','大事','小事']) for(let v of s){ console.log(v);//输出好事 小事 大事 小事 }
应用
//数组去重 let arr = [1, 2, 3, 4, 3, 2, 1]; let result = [...new Set(arr)]; console.log(result);//输出[1,2,3,4]
Map
ES6提供了Map数据结构,它类似于对象,也是键值对的结合。但’键‘的范围不限于字符串,各种类型的值(包括对象)都可以当做键。Map实现了iterator接口,所以可以使用扩展运算符和for...of进行遍历
let m = new Map();
属性和方法
属性和方法 | 返回值 |
---|---|
size | 返回Map的元素个数 |
set | 添加一个新的元素,返回当前Map |
get | 返回键名对象的键值 |
has | 检测Map中是否包含某个元素,返回布尔值 |
clear | 清空,返回undefined |
let m = new Map(); m.set('name','刘德华');//添加键值对类型 let key = { name : '张学友'; } m.set(key,['北京','上海']); m.delete('name');//删除键位name的键值对
class
ES6提供了更接近传统语言(java、c#等)的写法,引入了class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。基本上ES6的class可以看作只是一个语法塘,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象的原型的写法更加清晰、更像面向对象编程的语法而已
class Phone{ //构造方法 名字固定 constructor(brand,price){ this.brand = brand; this.price = price; } //方法必须使用该语法,不能使用ES5的对象完整形式 call(){//相当于ES5中 call:function(){} console.log('我可以打电话'); } }
类的静态成员
class Phone{ //静态属性 static name = '手机' } let nokia = new Phone(); cosole.log(nokia.name);//输出undefined cosole.log(Phone.name);//输出手机 //statci标注的属性属于类,不属于实例化对象
类继承
class Phone{ //构造方法 constructor(brand,price){ this.brand = brand; this.price = price; } //父类的成员属性 call(){ console.log('打电话') } } class SmartPhone extends Phone{ //构造方法 constructor(brand,price,color,size){ super(brand,price);//等同于构造继承中的Phone.call((brand,price) this.color = color; this.size = size; } photo(){ console.log('拍照') } playGame(){ console.log('玩游戏') } } const xiaomi = new SmartPhone('小米',799,'黑色','4.7inch'); //小米可以使用photo、playGame和父类的call方法
子类对父类方法的重写
//在子类中添加与父类同名方法,会调用子类的方法
class中的get和set
//get class Phone{ get price(){ console.log('数据被读取了') return 'iloveyou' } } let s = new Phone() console.log(s.price)//输出数据被读取了 和 iloveyou(函数的返回值就是属性的值,没有就是undefined) //set //set方法必须有参数 class Phone{ set price(newVal){ console.log('数据被修改了') } } let s = new Phone() s.price = 'free'//输出数据被修改了,修改方法时触发
数值扩展
0)Number.EPSILON是js中表示的最小精度。EPSILON属性的值接近于2.22*10的-16次方。主要用于浮点数运算
//因为浮点数的运算是有误差的。比如: console.log(0.1 + 0.2 === 0.3);//输出false
//运用 function equal(a,b){ if(Math.abs(a-b) < Number.EPSILON){//Math.abs求绝对值 return true; }else{ return false; } } console.log(0.1 + 0.2, 0.3);//true
1)二进制和八进制
2)Number.isFinite 检测一个数值是否为有限数
console.log(Number.isFinite(100));//true(100为有限数) console.log(Number.isFinite(100/0));//false
3)Number.isNaN 检测一个数值是否为NaN
console.log(Number.isNaN(100));//false
4)Number.parseInt、Number.parseFloat 字符串转整数
console.log(Number.parseInt('100'));//100 console.log(Number.parseFloat('3.1415926我'));//3.1415926
5)Number.isInterger判断一个数是否为整数
console.log(Number.isInterger(100));//true console.log(Number.isInterger(3.14));//false
6)Math.trunc将数字的小数部分抹掉
console.log(Number.trunc(3.14));//3
7)Math.sign判断一个数是正数、负数还是0
//如果是正数输出1;0输出0;负数输出-1 console.log(Number.sign(57));//1 console.log(Number.sign(0));//0 console.log(Number.sign(-44));//-1
对象方法扩展
1)Object.is 判断两个值是否完全相等
console.log(Object.is(57,57));//true console.log(Object.is(57,58));//false //和===的区别 console.log(Object.is(NaN,NaN));//true console.log(NaN === NaN);//false
2)Object.assign对象的合并
const star1 = { name:'刘德华', age:59 } const star2 = { name:'张学友', age:60 } console.log(Object.assign(star1,star2));//star2会把star1覆盖 //如果star1的属性star2没有,则会合并 //如果star1和star2的属性重名,则后面的会覆盖前面的
3)Object.setPrototypeOf、Object.getPrototypeOf
//设置原型对象Object.setPrototypeOf const star = { name:'刘德华', } const sang = { gequ:['冰雨','爱不完'] } Object.setPrototypeOf(star,sang); console.log(Object.getPrototypeOf(star));//gequ:['冰雨','爱不完'] console.log(star);//star的原型对象会有gequ:['冰雨','爱不完']
模块化
模块化是指讲一个打的程序文件,拆分成许多小的文件,然后将小文件组合起来
模块化的好处
1)防止命名冲突
2)代码复用
3)高维护性
模块化语法
模块功能主要由两个命令构成:export和import
-
export命令用于规定模块的对外接口
-
import命令用于输入其他模块提供的功能
模块暴露数据语法汇总
1)分别暴露
可以将js文件中所有export后面跟的内容(暴露数据)引入到html
//新建一个js文件(如:m1.js) export let star = '刘德华'; export function sang(){ console.log('冰雨') }
<!--html文件 --> <script type="module"> //引入m1.js模块内容 import * as m1 from "xxx/m1.js";//文件地址 //调用方法 m1.sang(); </script>
2)统一暴露
将多个数据一起暴露
//文件名(m2.js) let star = '刘德华'; function sang(){ console.log('冰雨') } export{star,sang};
<!--html文件 --> <script type="module"> //引入m2.js模块内容 import * as m2 from "xxx/m2.js";//文件地址 //调用方法 m2.sang(); </script>
3)默认暴露
//文件名(m3.js) export default{ star : '刘德华', sang : function(){ console.log('冰雨') } }
<!--html文件 --> <script type="module"> //引入m3.js模块内容 import * as m3 from "xxx/m3.js";//文件地址 //调用方法 m3.default.sang(); </script>
引入模块数据语法汇总
1)通用形式
<!--html文件 --> <script type="module"> //引入 模块内容 import * as m1 from "xxx/m1.js";//文件地址 </script>
2)解构赋值
<!--html文件 --> <script type="module"> //引入 模块内容 //对应分别暴露和统一暴露 import {star,sang} from "xxx/m1.js"; //如果重名可以添加as重新赋名 import {star as mingxing,sang as gequ} from "xxx/m2.js"; console.log(mingxing,gequ); //对应默认暴露 import {default as m3} from "xxx/m3.js";//不能直接使用default,所以要用as给default起别名 </script>
3)简便形式
只有默认暴露可以使用
import m3 from "xxx/m3.js";
4)新建js文件
//新建一个js文件(如:m.js) //将m1.js、m2.js、m3.js等引入到这个js文件中 import * as m1 from "xxx/m1.js"; import * as m2 from "xxx/m1.js"; import * as m3 from "xxx/m1.js";
<!--将m.js文件引入到html页面中--> <script src="xxx/m.js" type="module"></script>
ES7
Array.prototype.includes
includes方法用来检测数组中是否包含某个元素,返回布尔值类型
const sdmz = ['西游记','红楼梦','水浒传','三国演义'] console.log(sdmz.includes('西游记'));//true console.log(sdmz.includes('金瓶梅'));//false
指数操作符
在ES7中引入指数运算符 【**】,用来实现幂运算,功能与Math.pow结果相同
console.log(2 ** 10);//输出1024。2的10次方。等同于Math.pow(2,10);
ES8
async和await
async和await两种语法结合可以让异步代码像同步代码一样
async函数
-
async函数的返回值是promise对象
-
promise对象的结果由async函数执行的返回值决定
//async函数 async function fn(){ return '好!' } const result = fn(); console.log(result);//输出Promise对象 //只要返回的结果不是一个Promise类型的对象,则async函数返回的结果就是一个成功的Promise对象 //throw new Error('出错啦') //抛出错误,返回的就是一个失败的Promise对象 //返回的结果如果是一个Promise对象,Promise对象成功,返回值也成功;Promise对象失败,返回值也失败
await表达式
-
await必须写在async函数中
-
await右侧表达式一般为Promise对象
-
await返回的是Promise成功的值
-
await的Promise失败了,会抛出异常,需要通过try...catch捕获处理
const p = new Promise((resolve,reject) => { resolve('成功'); }) async function fn(){ let result = await p; console.log(result);//输出成功 } fn();
const p = new Promise((resolve,reject) => { reject('失败'); }) async function fn(){ try{ let result = await p; }catch(e){ console.log(e);//输出失败 } } fn();
结合发送AJAX请求
//发送ajax请求,返回的是promise对象 function sendAJAX(url){ return new Promise((resolve,reject) =>{ //创建对象 const x = new XMLHttpRequest(); //初始化 x.open('GET',url); //发送请求 x.send(); //绑定事件 x.onreadystatechanfe =function(){ if(x.reaydState === 4){ if(x.status >= 200 && x.status < 300){ resolve(x.response); }else{ reject(x.status); } } } }) } //Promise then方法测试 sendAJAX('https://xxx.com').then(value=>{ console.log(value); },reason=>{}) //async和await 测试 async function main(){ //发送AJAX请求 let result = await sendAJAX('https://xxx.com'); console.log(result); }
对象方法扩展
Object.values
获取对象中所有的值
const lol = { name:'英雄联盟', daqu:['电信','网通'], duanwei:['黑铁','黄铜','白银','黄金','铂金','钻石','宗师','大师','王者'] } //获取所有的键 console.log(Object.key(lol)); //获取所有的值 console.log(Object.values(lol));
Object.entries
将每个返回对象转换成数组
Object.getOwnPropertyDescriptors
返回对象属性的描述对象
ES9
扩展运算符
const Q = { q:'天音波'; } const W = { w:'金钟罩'; } const E = { e:'天雷破'; } const R = { r:'猛龙摆尾'; } const LeeSin{...Q,...W,...E,...R};//将四个对象合并到一个
rest参数
function fn({host,port,...user}){ console.log(host); console.log(port); console.log(user);//除了host和port的参数都会存到user中 } fn({ host:'127.0.0.1', port:3306, username:'root', password:'root' })
正则扩展
命名捕获分组
let str = '<a href="https://www.baidu.com/">百度</a>' //提取url与标签文本 //1.不用命名捕获 const reg = /<a href="(.*)">(.*)<\/a>/; const result = reg.exec(str); console.log(result[1]);//输出第1个小括号中的内容-https://www.baidu.com console.log(result[2]);//输出第2个小括号中的内容-百度 //2.使用命名捕获 const reg = /<a href="(?<url>.*)">(?<text>.*)<\/a>/; const result = reg.exec(str); console.log(result.groups.url);//输出:https://www.baidu.com console.log(result.groups.text);//输出:百度
反向断言
let str = 'JS1314我我哦我555啦啦啦' //正向断言 const reg = /\d+(?=啦)/; const result = reg.exec(str); console.log(result);//提取555 //反向断言 const reg = /(?<=我)\d+/; const result = reg.exec(str); console.log(result);//提取555
dotAll模式
dot有.的意思,.指正则表达式中元字符(除换行符外的任意单个字符)
ES10
对象扩展方法
Object.fromEntries
将二维数组转化为对象
Object.entries将对象转化为二维数组(ES8)
字符串方法扩展
trimStart和trimEnd
-
trim清除字符串两侧空白
-
trimStart清除字符串左侧空白
-
trimEnd清除字符串右侧空白
let str = ' iloveyou ' console.log(str);//输出 iloveyou 。 console.log(str.trimStart);//输出iloveyou 。 console.log(str.trimEnd);//输出 iloveyou。
数组方法扩展
flat和flatMap
-
flat有平的意思
-
将多维数组转化为低维数组
-
可以添加参数,参数为数字,意为深度。默认为1
//flat const arr = [1,2,3,[4,5]]; console.log(arr.flat());//输出[1,2,3,4,5] const arr1 = [1,2,3,[4,5,[6,7]]]; console.log(arr1.flat());//输出[1,2,3,4,5,[6,7]] console.log(arr1.flat(2));//输出[1,2,3,4,5,6,7]
//flatMap const arr = [1,2,3,4,5]; const result = arr.flatMap(item => [item*10]); console.log(result);//[10,20,30,40,50]
Symbol扩展
Symbol.prototype.description
用于获取Symbol字符串描述
let s = Symbol('德玛西亚'); console.log(s.description);//输出德玛西亚
ES11
私有属性
-
私有属性在前面加#
-
私有属性只能在对象里面获取,在外部输出不了
class Person{ //公有属性 name; //私有熟悉 #age; #weight; //构造方法 constructor(name,age,weight){ this.name = name; this.#age = age; this.#weight = weight; } fn(){ console.log(girl.#age);//输出18 } } //实例化 const girl = new Person('小红',18,'45kg'); console.log(girl.#age);//获取不了
Promise.allSettled
-
返回的Promise对象,是成功的
-
Promise.all返回的Promise对象,只要有一个失败就是失败的
String.prototype.matchAll
输出标签内容
可选链操作符 ?.
判断前面的值传入没有,再去执行下一步
动态import
按需加载
<button id="btn"></button> <script type="module"> const btn = document.querySelector('#btn'); btn.onclick = function(){ import('xxx/hello.js').then(module =>{ module.hello(); }) } </script>
//文件(hello.js) export function fn(){ alert('你好!') }
BigInt
大整形
在数字后+n
let n = 521n; console.log(n,typeof(n));//521n BigInt
函数
不能使用浮点数
let n = 520; console.log(BigInt(n));//520n
主要用于大数值运算
let max = Number.MAX_SAFE_INTEGER;//最大数 //不能正常运算 console.log(max+1); console.log(max+2); //可以正常输出 console.log(BigInt(max)+BigInt(1)); console.log(BigInt(max)+BigInt(2));
globalThis
始终指向全局对象