ECMAScript 是一种由 Ecma 国际(前身为欧洲计算机制造商协会)在标准 ECMA-262 中定义的脚本语言规范。这种语言在万维网上应用广泛,它往往被称为 JavaScript 或 JScript,但实际上后两者是 ECMA-262 标准的实现和扩展
ECMAScript 是由网景的布兰登·艾克开发的一种脚本语言的标准化规范;最初命名为Mocha,后来改名为 LiveScript,最后重命名为 JavaScript。1995年12月,升阳与网景联合发表了JavaScript。1996年11月,网景公司将 JavaScript 提交给欧洲计算机制造商协会进行标准化。ECMA-262 的第一个版本于 1997 年 6 月被 Ecma 组织采纳。ECMAScript 是由ECMA-262 标准化的脚本语言的名称。
版本 | 发表日期 | 与前版本的差异 |
---|---|---|
ES.8 | 1997年6月 | 首版 |
ES.9 | 1998年6月 | 格式修正,以使得其形式与ISO/IEC16262国际标准一致 |
ES.10 | 1999年12月 | 强大的正则表达式,更好的词法作用域链处理,新的控制指令,异常处理,错误定义更加明确,数据输出的格式化及其它改变 |
ES.无 | 放弃 | 由于关于语言的复杂性出现分歧,第4版本被放弃,其中的部分成为了第5版本及Harmony的基础;由ActionScript实现 |
ES.100 | 2009年12月 | 新增“严格模式(strict mode)”,一个子集用作提供更彻底的错误检查,以避免结构出错。澄清了许多第3版本的模糊规范,并适应了与规范不一致的真实世界实现的行为。增加了部分新功能,如getters及setters,支持JSON以及在对象属性上更完整的反射 |
ES.1.2 | 2011年6月 | ECMAScript标5.1版形式上完全一致于国际标准ISO/IEC 16262:2011。 |
ES6 | 2015年6月 | ECMAScript 2015(ES2015),第 6 版,最早被称作是 ECMAScript 6(ES6),添加了类和模块的语法,其他特性包括迭代器,Python风格的生成器和生成器表达式,箭头函数,二进制数据,静态类型数组,集合(maps,sets 和 weak maps),promise,reflection 和 proxies。作为最早的 ECMAScript Harmony 版本,也被叫做ES6 Harmony。 |
ES7 | 2016年6月 | ECMAScript 2016(ES2016),第 7 版,多个新的概念和语言特性 |
ES8 | 2017年6月 | ECMAScript 2017(ES2017),第 8 版,多个新的概念和语言特性 |
ES9 | 2018年6月 | ECMAScript 2018 (ES2018),第 9 版,包含了异步循环,生成器,新的正则表达式特性和 rest/spread 语法。 |
ES10 | 2019年6月 | ECMAScript 2019 (ES2019),第 10 版 |
ES11 | 2020年6月 | ECMAScript 2020 (ES2020),第 11 版 |
http://www.ecma-international.org/publications/standards/Standard.htm
http://www.ecma-international.org/publications/standards/Standard.htm
http://www.ecma-international.org/publications/standards/Ecma-262-arch.htm
http://kangax.github.io/compat-table/es6/
let obj = {
name: 'xiansheng',
age: 23,
obj1: function () {
console.log('hello');
},
}
let {name, age, obj1} = obj;
console.log(name,age,obj1())
应用场景:频繁使用对象方法、数组元素,就可以使用解构赋值形式。
let name = 'jack';
console.log(`我的名字叫${name}`);
```应用场景:当遇到字符串与变量拼接的情况使用模板字符串。```
let name= 'xiansheng';
let age = 35;
let obj1= function () {
console.log('obj1');
}
//简写
const obj = {
name,
age,
obj1
}
应用场景:对象简写形式简化了代码,所以以后用简写就对了。
fun(a,b){console.log(a+b)} =》 (a,b)=>{console.log(a,b)}
fun(a){return a} =》 当只有一个参数且只有一个返回值的时候可以这样; a=>a;
(x, y, z=3) =>{console.log(x + y + z) };
console.log(add(1, 2)); // 6
* 可与解构赋值结合:
```javascript
function connect({ host = '127.0.0.1', uesername, password, port }) {
console.log(host); // 127.0.0.1
console.log(uesername); //root
console.log(password); //root
console.log(port); //3306
}
connect({
// host: 'docs.mphy.top',
uesername: 'root',
password: 'root',
port: 3306
})
let Fun= (a, b, ...arr) => {
console.log(a);//1
console.log(b);//2
console.log(arr);//[3,4,5]
};
Fun(1,2,3,4,5);
* 案例
```javascript
let add = (...arr) => {
let sum = arr.reduce((pre, cur) => {
return pre + cur
});
return sum;
}
console.log(add(1, 2, 3, 4, 5)); // 15
应用场景:rest 参数非常适合不定个数参数函数的场景
function fn(a, b, c) {
console.log(arguments); //Arguments(3) [1, 2, 3, Function, Function]
console.log(a + b + c); //6
}
let arr = [1,2,3];
fn(...arr)
* 数组合并:
```javascript
let A = [1, 2, 3];
let B = [4, 5, 6];
let C = [...A, ...B];
console.log(C); // [1, 2, 3, 4, 5, 6]
* 浅克隆数组:
```javascript
let arr1 = ['a', 'b', 'c'];
let arr2 = [...arr1];
console.log(arr2); // ['a', 'b', 'c']
* 将伪数组转换为真实数组
```javascript
let div= document.querySelectorAll('div');
let divArr = [...div];
console.log(divArr);
* 对象合并
```javascript
// 合并对象
let obj1 = {
a: 123
};
let obj2 = {
b: 456
};
let obj = { ...obj1, ...obj2};
console.log(obj); //{ a: 123, b: 456}
let s1 = Symbol();
console.log(s1, typeof s1); // Symbol() symbol
let s2 = Symbol('1');
let s2_1 = Symbol('1');
console.log(s2 === s2_1); // false Symbol 都是独一无二的
let s3 = Symbol.for('apple');
let s3_1 = Symbol.for('apple');
console.log(s3 === s3_1); // true
let s4 = Symbol('测试');
console.log(s4.description); // 测试
// 这是一个 game 对象,假设我们不知道里面有什么属性和方法
const game = {
uname: '俄罗斯方块',
up: function () { },
down: function () { }
}
// 通过 Symbol 生成唯一的属性名,然后给 game 添加方法
let [up, down] = [Symbol('up'), Symbol('down')];
game[up] = function () {
console.log('up');
}
game[down] = function () {
console.log('down');
}
// 调用刚刚创建的方法
game[up]();
game[down]();
方法 | 描述 |
---|---|
Symbol.hasInstance | 当其他对象使用 instanceof 运算符,判断是否为该对象的实例时,会调用这个方法 |
Symbol.isConcatSpreadabl | 对象的 Symbol.isConcatSpreadable 属性等于的是一个布尔值,表示该对象用于Array.prototype.concat() 时,是否可以展开 |
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 环境排除。 |
11.1 定义
let obj={
name:"先生",
arr:[1,1,5,4,4,5,88,88,89],
[Symbol.iterator]:function (){
let _this=this
let index=0
return{
next:function (){
if(index<_this.arr.length){
let data={value:_this.arr[index],done:false}
index++
return data
}else{
return{value: undefined,done: true}
}
}
}
}
}
for (const objElement of obj) {
console.log(objElement)
}
11.2 工作原理
12.1 生成器函数的声明和调用
案例:
第一种玩法:
function * Fun() {
console.log("一只老虎")
let result1=yield "我是第一个!";
console.log(result1)
console.log("两只老虎")
let result2=yield "我是第二个!";
console.log(result2)
console.log("真可爱")
let result3=yield "我是第三个!";
console.log(result3)
}
let fun=Fun()
fun.next()
fun.next("我是第一个的回调")
fun.next("我是第二个的回调")
fun.next("我是第三个的回调")
第二种玩法:
function one() {
setTimeout(()=>{
console.log("第一单")
let data="第一单"
results.next(data)
},1000)
}
function two() {
setTimeout(()=>{
console.log("第二单")
let data="第二单"
results.next(data)
},2000)
}
function three() {
setTimeout(()=>{
console.log("第三单")
let data="第三单"
results.next(data)
},3000)
}
function * sum() {
one()
let onea=yield ""
console.log(onea)
let twoa=yield two()
console.log(twoa)
let threea=yield three()
console.log(threea)
}
let results=sum()
results.next()
//第一单
//第一单
//第二单
//第二单
//第三单
//第三单
14.1 Set 的定义和使用
let st1 = new Set();
let st2 = new Set([可迭代对象]);
14.2 案例:
let s=new Set(['大事儿','小事儿','小小事儿','大二事'])
s.add("小小儿")
console.log(s) //Set(5) {"大事儿", "小事儿", "小小事儿", "大二事", "小小儿"size: 5}
s.delete("小小儿")
console.log(s) //Set(4) {"大事儿", "小事儿", "小小事儿", "大二事"size: 4}
console.log(s.has("大事儿")) //true
s.clear() //Set(0) {size: 0}
console.log(s)
* 案例2~~~```结和 mew Set() 完成:并集、交集、数组去重、差集```
```javascript
定义两个数组
let arr=[1,2,5,4,8,8,4,5]
let arr1=[1,5,2,88,88,99,4,5,5]
// 并集、
let sum=new Set([...arr,...arr1])
console.log(sum,"1") //Set(7) {1, 2, 5, 4, 8size: 7, ...}1
// 交集、
let intersection=[...new Set(arr)].filter(item=>{
return new Set(arr1).has(item)
})
console.log(intersection,"2") //Array(4) [1, 2, 5, 4] 2
// 数组去重、
let TheRepeat=new Set([...arr,...arr1])
console.log(TheRepeat,"3") //Set(7) {1, 2, 5, 4, 8size: 7, ...}3
// 差集
let differenceSet=[...new Set(arr)].filter(item=>{
return !(new Set(arr1).has(item))
})
console.log(differenceSet,"4") //Array(1) [8] 4
//声名map
let map=new Map();
console.log(map)
// 添加元素
map.set({name:"郭先生"},"郭先生!")
// 获取
console.log(map.get('name'))
// size个数
console.log(map.size)
// 删除
console.log(map.delete('name'))
// 查询
console.log(map.has('name'))
// 清空
map.clear()
##原始的创建方法
function Fun1(name,age) {
this.name=name
this.age=age
}
Fun1.prototype.fun1=function (){
console.log("可以打电话了!")
}
let newFun1=new Fun1("郭先生",18)
console.log(newFun1)
##Class方法
class Fun2{
fun2(){
console.log("可以打电话了!")
}
constructor(name,age) {
this.name=name
this.age=age
}
}
let newFun2=new Fun2("郭先生",18)
console.log(newFun2)
16.2 extends 类继承和方法的重写
class cal1{
constructor(a,b) {
this.a=a
this.b=b
}
la(){
console.log(5)
}
}
class cal2 extends cal1{
constructor(a,b,c,d) {
类的继承
super(a,b);
this.c=c
this.d=d
}
类的重写
la(){
console.log(5)
}
}
let a=new cal2(1,1,1,1)
a.la()
console.log(a)
16.3 getter 和 setter
class setget{
get person(){
console.log("我不干净了!")
}
set person(value){
console.log("我一点也不干净了!")
console.log(value)
}
}
let person=new setget()
console.log(person)
person.person="name"
let number=55.5
console.log(Number.isInteger(number)) //判断是不是整数
console.log(Number.isFinite(number)) //判断是不是有限数
console.log(Number.isNaN(number)) //判断是不是NaN
console.log(Number.parseInt(number)) //整数化
console.log(Number.parseFloat(number)) //浮点化
console.log(Math.trunc(number)) //去掉小数点
console.log(Math.sign(number)) //判断一个数到底为正数 负数 还是零
console.log(Object.is(5,5)); //true
let a={
name:"guoxiansheng",
age:18
}
let b={
name:"guoxiansheng1",
ag2e:189
}
console.log(Object.assign(a,b)) //Object {name: "guoxiansheng1", age: 18, ag2e: 189}
18.1 Object.setPrototypeOf 和 Object.getPrototypeof
const school = {
name: '尚硅谷'
}
const cities = {
xiaoqu: ['北京','上海','深圳']
}
Object.setPrototypeOf(school, cities);
console.log(Object.getPrototypeOf(school)); //Object {xiaoqu: Array(3)}
console.log(school); //Object {name: "尚硅谷"}
npm install jquery
import
导入即可。import $ from 'jquery';
arr.includes("nane") indexOF()
Math.pow(2,10)->>console.log(2 ** 10)
两者搭配使用会产生化学反应 因为之前以及写过文章了这里就不写了 可以去我的博客收Promise入门(此篇足以)
let obj = {
a: 1,
b: {1:2},
c: [1,2,3]
}
console.log(Object.values(obj))
// [1, {1: 2}, [1,2,3]]
console.log(Object.keys(obj))
// ['a', 'b', 'c']
* Object.entries() 方法返回一个给定对象自身可遍历属性 [key,value] 的数组(以键值对的形式存在)
```Javascript
const obj = {a: 1, b: 2, c: 3};
console.log(Object.entries(obj))
// [ [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] ]
const obj = { a: 1, b: 2, c: 3 };
for (let [k, v] of Object.entries(obj)) {
console.log(k, v)
}
Object.formEntries([],[])
new Map().set("name","guo")
Object.formEntries(new Map())
把数组转换为键值对象
es8做对比把对象转化为数组-->
trimStart() 去除字符串开头连续的空格(trimLeft 是此方法的别名)
trimEnd() 去除字符串末尾连续的空格(trimRight 是此方法的别名)
多维转1维
let arr=[[1,5,[4,[8]]]]
console.log(arr) ///Array(1) [Array(3)]
console.log(arr.flat(3)) ///Array(4) [1, 5, 4, 8]
let arr1=[1,5,4,8,4]
console.log(arr1.flatMap(item=>[item*10])) ///Array(5) [10, 50, 40, 80, 40]
let sym = Symbol('hello')
console.log(sym.description)
// hello
class cls{
name
#age
#height
constructor(name,age,height) {
this.name=name
this.#age=age
this.#height=height
}
fun(){
console.log(this.#age)
console.log(this.#height)
}
}
let clss=new cls("gxs",21,1.75)
console.log(clss.height)
console.log(clss)
console.log(clss.name)
clss.fun()
更 多可以去我博客搜Promise入门
let user = {
obj1: {
}
}
console.log( user?.obj1?.name); undefined 不报错
这有和 && 的作用类似,但上述改用 && 会显得代码冗余度高:
console.log(user && user.address && user.address.street)
function foo() {
console.log('hello')
}
foo?.()
// hello
* ?.[] 允许从一个可能不存在的对象上安全地读取属性。(即使不存在也不报错)。
```javascipt
let obj = {
key: 123
}
console.log(obj?.['key'])
// 123
const btn = document.getElementById('btn');
btn.onclick = function(){
import('./hello.js').then(module => {
module.hello();
}
let n1 = 123n
let n2 = 456n
let n3 = BigInt(789)
console.log(typeof n1) // bigint
console.log(n1+n2) // 579n
console.log(n2+n3) // 1245n
比较运算符:
alert( 2n > 1n ); // true
alert( 2n > 1 ); // true
alert( 1 == 1n ); // true
alert( 1 === 1n ); // false
let but=document.getElementById('but');
but.οnclick=function (){
console.log(this);
console.log(globalThis)
}
以上是个人学习Es6~Es11的相关知识点,一点一滴的记录了下来,有问题请评论区指正,共同进步,这才是我写文章的原因之,如果这篇文章对您有帮助请点个赞