只例举 EcmaScript 的变化,不说细节
建议经常看看 EcmaScript 的改变以及提案,很多语法都在像 Linux Shell 等靠齐,相信 JavaScript(EcmaScript)会越来越强大,当然,TypeScript 作为 JavaScript 的语法糖,也是一样的。。
1.let && const
用于声明变量,只在当前代码块内生效,const 相比于 let,const 声明常量,对于引用类型,不限制其改变,两者都不存在变量提升
for (let i = 0; i < 10; i++) {
}
console.log(i);
// ReferenceError: i is not defined
const a=0;
a=1; //Uncaught TypeError: Assignment to constant variable.
2.解构赋值
提取数组和对象里的值,对变量进行赋值,这里的数组包括下面要说的 Set 等,但是不包括 Map
let [a, b, c] = [1, 2, 3]; // a:1 b:2 c:3
let {name}={name:'duanxl'} // name:duanxl
let {foo} = {foo: 'baz'}; // foo:baz
3.字符串扩展
比如对字符串增加了迭代器(Itertor),模板字符串等等
const domain='duanxl';
const com=`https://${domain}.cn`
let str='duanxl';
for(let i of str){
// ...
}
4.字符串新增方法
5.针对于正则扩展
这里就不例举了。。。
6.数字的扩展
7.箭头函数
// 普通函数
var func=function(){};
// 箭头函数
const func=()=>{};
// rest表达式
cosnt func=(...args)=>{console.log(args)}
注意点:
8.数组的扩展
9.对象的新增方法
10.Symbol
新增基本数据类型 undefined,number,string,null,boolean,bigInt,Symbol,目前 7 种,bigInt 在 Es9 中。。。
表示唯一存在的数据,可以消除魔术变量名等
11.Set
类似数组,成员唯一不重复的 Set 对象
WeakSet:与 Set 相似,WeakSet 的成员只能是对象,WeakSet 中的对象都是弱引用,如果没有其他引用,会立即回收
12.Map
键值对的集合(Hash) 结构,只能使用字符串作为 key,与上面的 Set 属性方法差不多,也存在 WeakMap
13.Proxy
代理目标对象,属于元编程
14.Reflect
与 Proxy 相辅相成,属于元编程,一个代理,一个反射,将明显属于语言内部的方法放到 Reflect 上,看提案,以后会完善
15.Promise
异步编程的解决方案 只有三种状态:pending,fulfilled,rejected
16.Itertor
遍历器,属元编程
看了眼提案,之后还会完善 Itertor,实现其异步遍历
//为对象添加Itertor
let obj = {
data: [ 'hello', 'world' ],
[Symbol.iterator]() {
const self = this;
let index = 0;
return {
next() {
if (index < self.data.length) {
return {
value: self.data[index++],
done: false
};
} else {
return { value: undefined, done: true };
}
}
};
}
};
// 因为数组,字符串等默认就有Itertor,可以直接调用
let arr = ['a', 'b', 'c'];
let iter = arr[Symbol.iterator]();
iter.next() // { value: 'a', done: false }
iter.next() // { value: 'b', done: false }
iter.next() // { value: 'c', done: false }
iter.next() // { value: undefined, done: true }
一般,使用 rest 表达式会调用 Itertor,还有解构,还有 Generator 函数也会调用
17.Generator
异步编程的解决方案,相当于一个状态机,内部状态有序操控,是对协程的实现
// 实例
function* helloWorldGenerator() {
yield 'hello';
yield 'world';
return 'ending';
}
var hw = helloWorldGenerator();
hw.next()
// { value: 'hello', done: false }
hw.next()
// { value: 'world', done: false }
hw.next()
// { value: 'ending', done: true }
hw.next()
// { value: undefined, done: true }
//为对象添加Itertor
let obj = {}
myIterable[Symbol.iterator] = function* () {
yield 'hello';
yield 'world';
};
18.async
// 实现原理,其实就是将Generator加装在一个函数体内
// 当然,这个函数不能执行,因为我用了关键字。。。
function async(args) {
return spawn(function* () {
// ...
});
}
19.ArrayBuffer
数组二进制缓冲区
20.class
这里就不说了,之前的原型链继承
21.module
引入 module 语法, import,export,export default 等等
// 改进后
async function process(array) {
for await (let i of array) {
doSomething(i);
}
}
其他改变就不例举了,比如正则的捕获等
不知道有啥用,我太菜了。。
Dynamic import
if(...) {
const menu = import('...');
}
globalThis
在 Web Worker 或者 iframe 中,只有 self 可以取到全局对象,而在 node 中,只能使用 global,globalThis 解决了这个问题,作为顶层对象
有效变量判断符 ??,相比于||,??会判断左侧的的值是否为null或者undefined,如果左侧是 0,不会像||那样直接选择右侧的值
可选链 ?.
Promise.any(),和 race 反了一下,只要参数实例有一个变成 fulfilled 状态,包装实例就会变成 fulfilled 状态;如果所有参数实例都变成 rejected 状态,包装实例就会变成 rejected 状态
Promise.allSettled(),接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例。只有等到所有这些参数实例都返回结果,不管是 fulfilled 还是 rejected,包装实例才会结束。即所有 Promise 回调执行后即结束