手机版

ECMAScript6新特性范例大全

时间:2021-09-05 来源:互联网 编辑:宝哥软件园 浏览:

ECMAScript6(ECMAScript 2015,ES5,ES2016)技术已经在前端圈子很流行了,他给前端开发人员带来了很多惊喜,提供的语法糖使复杂的操作变得简单。

本文没有详细描述这些新特性,因为网上都已经有很多相关的介绍了。主要针对ES6新特性收集了相关范例代码,他可以让你快速了解这个新的爪哇岛描述语言规范。

箭头函数

功能()函数的简写表示法,但它不绑定这个。

var赔率=evens。map(v=v 1);//没有父母,也没有bracketsvar nums=evens.map((v,I)=v I);var对=evens。map(v=({偶数:v,奇数:v ^ 1 });//语句bodiesnums。foreach(v={ if(v % 5===0)五。push(v);});这是如何工作的?

var object={ name: 'Name ',arrowGetName: ()=this.name,常规GetName:函数(){ return this。Name },arrow get this :()=this,regular get this : function(){ return this } } console。日志(这个。名称)控制台。日志(对象。arrow getname());控制台。日志(对象。arrow getthis());控制台。记录(此)控制台。日志(对象。正则getname());控制台。日志(对象。正则getthis());结果:

这个。名称-对象。arrow getname()-对象。arrowgetthis()-[对象窗口]这个-[对象窗口]对象。正则getname()-Name对象。常规get this()-{ ' Name ' : ' Name ' }

Classes(类)

我们知道"真正"语言中的类(类别).在ES6中类(类别)其实是原型继承的语法糖。

SkinnedMesh类扩展了三.Mesh {构造器(几何,材料){ super(几何,材料);这个。idmatrix=skinnedmesh。default matrix();这个。bones=[];这个。骨基质=[];//.}更新(相机){ //.超级棒。update();}获取骨骼计数(){返回此。骨头。长度;}设置矩阵类型(矩阵类型){这。id matrix=SkinnedMesh[矩阵类型]();}静态defaultMatrix(){ 0返回新的三.矩阵4();}}Lebab.io

增强的对象字面量

var ProToObj={ ToString : function(){ return ' ThE ProToObj To string ' } } var handler=()=' handler ' var obj={/_ _ proto _ _ _ _ _ ProToObj ://handler : handler ' handler的简写,//方法toString() { //Super调用返回超级。ToString();},//计算(动态)属性名[' prop _ '(()=42)()]: 42 };控制台。日志。handler)控制台。日志。handler())控制台。日志。tostring())控制台。日志。道具_ 42)结果:

物体。handler-()=“handler”obj。handler()-handler robj。tostring()-d ThE Protobject To string bj。道具_ 42-42

字符串插值

字符串插值的好语法

字符串插值

var name='Bob ',time=' todayvar multiLine='此行pan multipleLine ' console。日志(` hello $ { name },你好${time}?`)console.log(multiLine)结果:

`你好${name},你好${time}?你好,鲍勃,你今天好吗?多行-该行跨越多行

解构 Destructuring

愚人码头注:列表匹配

//list 'matching'var [a,b]=[1,2,3];控制台。日志(a)结果:

a - 1b - 3对象也能很好的解构

nodes=()={ return {op: 'a ',lhs: 'b ',rhs: 'c'}}var { op: a,lhs: b,RHS 3360 c }=nodes()console。日志控制台。日志控制台。日志(c)结果:

a - ab - bc - c使用速记表示法。

nodes=()={ return {lhs: 'a '、op: 'b '、RHS : ' c ' }//绑定scopevar {op、lhs、rhs}中的` op`、lhs `和` RHS '=nodes()控制台。日志(op)控制台。日志(lhs)控制台。日志结果:

op - blhs - arhs - c可在参数位置使用

函数g({ name : x }){ return x }函数m({ name }){ return name }控制台。log(g({ name : 5 })控制台。日志(m({ name : 5 }))结果:

g({ name : 5 })-5m({ name : 5 })-5

故障弱化解构

var[a]=[]var[b=1]=[]var c=[];控制台。日志控制台。日志(b);控制台。日志(c);结果:

a - undefinedb - 1c - []

参数默认值(Default)

函数f(x,y=12){ return x y;}控制台。log(f(3))控制台。对数(f(3,2))结果:

f(3) - 15f(3,2) - 5

扩展(Spread)

在函数中:

函数f(x,y,z){ return x y z;}//传递数组的每个元素作为参数console.log(f(.[1,2,3]))结果:

f(.[1,2,3]) - 6在数组中:

var parts=['肩膀','膝盖'];定义变量歌词=['头',零件,'和','脚趾'];console.log(歌词)结果:

歌词- ['头','肩','膝','和','脚趾']

扩展 + 对象字面量

我们可以使用这个创造很酷的对象。

让{ x,y,z }={ x: 1、y: 2、a: 3、b : 4 };控制台。log(x);//1个con sole。日志(y);//2 con sole。log(z);//{ a: 3,b : 4 }//Spread属性让n={ x,y,z };控制台。log(n);//{ x: 1,y: 2,a: 3,b: 4 }console.log(obj)可惜的是它还不支持:

国家预防机制安装-保存-开发巴贝尔-插件-转换-对象-休息-传播

Rest

我们可以使用休息操作符来允许无限参数。

功能演示(第一部分,第2部分){ 0返回{part1,part2}}console.log(演示(1,2,3,4,5,6))结果:

demo(1,2,3,4,5,6) - {'part1':1,' part2':[2,3,4,5,6]}

Let

let是新的var。因为它有块级作用域。

{ var global var='来自演示1 ' } { let global let='来自演示2 ';}控制台。日志(全局var)控制台。日志(全局字母)结果:

globalVar -来自演示1 globalLet-referenceerror :未定义全球信函但是,它不会向窗户分配任何内容:

让我走='走;//全局作用域var i=' able//全局作用域控制台。日志(窗口。我);控制台。日志(窗口。(一);结果:

窗户。我-不设防的伦敦。我能不能使用让重新声明一个变量:

让我=' foo '让我='吧;控制台。日志(我);结果:

语法分析器:标识符“我”已经被声明为变量me=" foovar me=' barconsole.log(me)结果:

me - bar

Const

const是只读变量。

const a='b'a='a '结果:

类型错误:常量变量赋值。应该注意,const对象仍然可以被改变的。

const a={ a : ' a ' } a . a=' b '控制台。日志(a)结果:

a - {'a':'b'}

For..of

迭代器的新类型,可以替代为.在2005年。它返回的是值而不是钥匙。

let list=[4,5,6];console.log(列表)为(让我在列表中){控制台。日志(一);}结果:

list - [4,5,6]i - 0i - 1i - 2let list=[4,5,6];console.log(列表)用于(列表中的字母I){控制台。日志(一);}结果:

列表- [4,5,6]i - 4i - 5i - 6

迭代器(Iterators)

迭代器是一个比数组更动态的类型。

让无限={[symbol . iterator]({)让c=0;返回{ next(){ c;返回{ done: false,值: c } } } } }控制台。日志(“开始”);对于(var n为无穷大){ //如果(^ 10号)中断,则在1000处截断序列;控制台。log(n);}结果:

start '-startn-1n-2n-3n-4n-5n-6n-7n-8n-9n-10使用打字稿,我们可以看到它接口的样子:

接口迭代器结果{ done:布尔值;value: any}接口迭代器{ next(): IteratorResult;}可迭代接口{[符号。迭代器]():迭代器}

生成器(Generators)

生成器创建迭代器,并且比迭代器更具动态性。他们不必以相同的方式跟踪状态并不支持完成的的概念。

var infinity={[符号。迭代器]:函数*(1){ var c=1;for(;){产量c .} } }控制台。(var n of infinity){//如果(^ 10号)中断,则在1000处截断序列;控制台。log(n);}结果:

start '-startn-1n-2n-3n-4n-5n-6n-7n-8n-9n-10使用以打字打的文件再次显示接口:

接口生成器扩展迭代器{下一个(值? any): IteratorResult;抛出(例外: any);}函数*迭代器和生成器

一个产量的例子*

函数*其他GENERATOR(I){ yield I 1;产量I2;产量i3;}函数*生成器(一){产量一;产量*另一个发电机;产量i 10}var gen=发电机(10);console.log(gen.next().值);console.log(gen.next().值);console.log(gen.next().值);console.log(gen.next().值);console.log(gen.next().值);结果:

gen.next().value - 10gen.next().value - 11gen.next().value - 12gen.next().value - 13gen.next().值- 20

Unicode

ES6为统一码提供了更好的支持。

var regex=new RegExp('\u{61} ',' u ');控制台。日志(正则表达式。unicode)控制台。日志(' ud 842 \ udfd 7 ')控制台。日志(' \ ud 842 \ udfd 7 ' .codePointAt())结果:

regex.unicode - true'' -' ' .codePointAt() - 134103

模块和模块加载器

原生支持模块。

从"模块名"导入默认成员从"模块名称"中导入*作为名称;从"模块名称"导入{成员};从"模块名称"导入{成员作为别名};从"模块名称"导入{成员1,成员2 };将{成员1,成员2 }导入为alias2 , [.] }来自"模块名";导入默认成员,{成员[,[.] }来自"模块名";从"模块名称"中导入defaultMember,* 1作为名称;导入"模块名称";导出{ name1,name2,…,Namen };将{变量1导出为名称1,变量2导出为name2,…,Namen };导出信函名称1、名称2、…、名称n;//同样varexport让name1=…,name2=…,…,nameN//同样是var,constexport表达式;导出默认表达式;导出默认函数(…) { … } //还类,函数*导出默认函数name1(…) { … } //还类,函数*导出{姓名1为默认,…};从…导出*;从…导出{名称1,名称2,…,名称n };从…导出{导入一为名称1,导入2为名称2,…,名称n };进口出口

Set

集为数学对应,其中所有项目都是唯一的。对于知道结构化查询语言的人来说,这相当于独特的。

var Set=new Set();set.add('马铃薯')。添加('番茄')。添加('番茄');控制台。日志(设置。尺寸)控制台。日志(设置。“has(”番茄'))适用于(集合中的不同项目){ console.log(项目)}结果:

set.size - 2set.has('番茄)- trueitem - Potatoitem - TomatoSet

WeakSet

WeakSet对象允许您在集合中存储弱持有的对象。没有引用的对象将被垃圾回收。

var item={ a : ' Potato ' } var set=new WeakSet();set.add({ a: '马铃薯' })。添加(项目)。添加({ a: '番茄' })。添加({ a: '番茄' });控制台。日志(设置。尺寸)控制台。日志(设置。has({ a : '番茄}))控制台。日志(设置。有(项)用于(让项集){控制台。日志(项目)}结果:

准备好。大小-未定义的数据集。has({ a : '番茄}) - falseset.has(项)-truetyperror : set[符号。迭代器]不是函数WeakSet

Map

地图也称为词典。

var Map=new Map();map.set('马铃薯',12);map.set('番茄',34);控制台.日志(地图.获取('马铃薯')用于(让项目进入地图){ console.log(项目)}用于(让项目进入地图){ console.log(项目)}结果:

map.get('马铃薯)- 12item - ['马铃薯,12]项- ['番茄',34]可以使用除字符串之外的其他类型。

var Map=new Map();var key={a: 'a'}map.set(key,12);控制台。日志(地图。get(key))控制台。日志(地图。get({ a : ' a ' })结果:

地图。get(key)-12地图。get({ a : ' a ' })-undefinedMap

WeakMap

使用键的对象,并且只保留对键的弱引用。

var WM=new weak map();var O1={ } var O2={ } var O3={ } WM。set(O1,1);wm.set(o2,2);wm.set(o3,{ a : ' a ' });wm.set({},4);控制台。日志(WM。get(O2));console.log(wm.has({}))删除O2;控制台。日志(WM。get(O3));用于(让项目进入wm) { console.log(项目)}for(让项目进入wm) { console.log(项目)}结果:

WM。获得(O2)-2毫米。has({ })-false WM。get(O3)-{ ' a ' : ' a ' }类型错误: WM[符号。迭代器]不是functionWeakMap

代理(Proxy)

代理可以用来改变对象的行为。它们允许我们定义陷阱。

var obj=function ProfanityGenerator(){ return { words : '恐怖单词} }()var handler=function detectinghandler(){ return { get : function(target,key){ return target[key]} .替换('恐怖','美好');},}}()var proxy=new Proxy(obj,handler);控制台。日志(代理。字数);结果:

代理人。单词-漂亮的单词提供以下陷阱:

定义变量处理程序={ get:set:has:deleteProperty:应用:construct:getowntpropertysdescriptor :定义操作:getPrototypeOf:设置:的协议类型.枚举:ownKeys:预防措施:isExtensible:}代理

Symbols

符号是一个新类型。可用于创建匿名属性。

var类型符号=Symbol(' type ');类pet { constructor(type){ this[typeymbol]=type;} GetType(){ 0返回此[类型符号];} } var a=new Pet(' dog ');控制台。log(a . GetType());控制台。日志(对象。getowntpropertnetames(a))控制台。日志(符号(' a')==符号(“a”)结果:

a。GetType()-DogObject。getowntpropertynames(a)-[]符号(' a')==符号(' a') -假更多信息

可继承内置函数

我们现在可以继承原生类。

班级习惯光线扩展数组{ } var a=new习惯光线();a[0]=2console.log(a[0])结果:

a[0] - 2不能使用数组的代理(代理)来覆盖吸气剂函数。

新类库

各种新的方法和常量。

控制台日志(编号EPSILON)控制台。日志(编号。isinteger(Infinity))控制台。日志(编号。isnan(' NaN ')控制台。日志(数学。控制台。日志(数学。hypt(3,4))控制台。日志(数学。imul(Math.pow(2,32) - 1,数学。pow(2,32) - 2))console.log('abcde ' .包括(“光盘”)控制台。日志(' ABC ').重复(3) )console.log(Array.of(1,2,3) )console.log([0,0,0]).填充(7,1))控制台日志([1,2,3]。find(x=x==3) )console.log([1,2,3]).find index(x=x==2))控制台。log([1,2,3,4,5]).copy InTerface(3,0)) console.log(['a ',' b ',' c'].entries() )console.log(['a ',' b ',' c'].keys() )console.log(['a ',' b ',' c'].values())控制台。日志(对象.赋值({},{ origin: new Point(0,0) }))结果:

号码-2.220446049250313 e-16号。是整数(无穷大)-假数字。是NAn(' NAn ')-假数学。acosh(3)-1。58860 . 88888888861hypt(3,4) - 5Math.imul(Math.pow(2,32) - 1,Math.pow(2,32) - 2) - 2'abcde ' .包括(“CD”)-真abc ' .重复(3)-ABc ABc阵列。(1,2,3) - [1,2,3][0,0,0]的.填充(7,1) - [0,7,7][1,2,3]。find(x=x==3) - 3[1,2,3].findIndex(x=x==2) - 1[1,2,3,4,5]。copy InTerface(3,0) - [1,2,3,1,2]['a ',' b ',' c'].条目()- {}['a ',' b ',' c'].keys() - {}['a ',' b ',' c'].values() - TypeError: ['a ',' b ',' c'].价值观念不是functionObject.assign({},{ origin: new Point(0,0) }) - ReferenceError: Point未定义文档:数字,数学,数组。从,数组。的数组。原型。复制内部,对象。分配

二进制和八进制

二进制和八进制数字的字面量。

控制台。日志(0b 11111)控制台。日志(0o 2342)控制台。日志(0xff);//也在es5中结果:

0b 1111-310 o 2342-12500 xff-255

Promises

异步编程。

var p1=新的承诺(解析,拒绝)={ setTimeout(()=解析(' 1 ',101)})var p2=新的承诺(解析,拒绝)={ setTimeout(()=解析(' 2,100)})Promise.race([p1,p2]).然后((RES)={控制台。log(RES)})承诺。所有([P1,p2]).然后((res)={ console.log(res)})结果:

res - 2res - ['1 ',' 2 ']

快速的 Promise

var P1=promise。解析(' 1 ')变量p2=承诺。拒绝承诺。种族(P1,p2).然后((res)={ console.log(res)})结果:

第1

快速失败

号决议如果一个承诺失败,全部和人种也将拒绝(拒绝)。

var p1=新的承诺(解析,拒绝)={ setTimeout(()=解析(' 1 ',1001)})var p2=新的承诺(解析,拒绝)={ setTimeout(()=拒绝(' 2,1)})Promise.race([p1,p2]).然后((RES)={控制台。日志('成功' RES)},RES={控制台。日志(' error ' RES)})承诺。所有([P1,p2]).然后((RES)={控制台。日志('成功' res)},res={ console.log('错误' RES)})结果:

错误res -错误2 '错误res -错误2更多信息

反射(Reflect)

新类型的元编程与新的应用程序接口现有的还有一些新的方法。

var z={ w : ' Super Hello ' } var y={ x : ' Hello ',_ _ proto _ _ : z };控制台。日志(反映。getowntpropertysdescriptor(y,' x ');console.log(Reflect.has(y,' w '));console.log(Reflect.ownKeys(y,' w '));console.log(Reflect.has(y,' x '));控制台。日志(反映。删除属性(y,' x ')console . log(reflect . has(y,' x '));结果:

反思。GetOwnPrOperty描述符(y,' x') - {'value':'hello ','可写' :街'可枚举:真实反映。has(y,' w') - trueReflect.ownKeys(y,' w') - ['x']Reflect.has(y,' x ')-true reflect。删除属性(y,' x') - trueReflect.has(y,' x') - false更多信息

尾调用(Tail Call)优化

尾调用的概念非常简单,一句话就能说清楚,就是指某个函数的最后一步是调用另一个函数。

ES6可以确保尾调用不会造成堆栈溢出。 (不是所有的实现工作)。

函数阶乘(n,acc=1) { if (n=1)返回行政协调会;返回阶乘(n - 1,n * ACC);}console.log(阶乘(10))console.log(阶乘(100))控制台.日志(阶乘(1000))控制台.日志(阶乘(10000))控制台.日志(阶乘(100000))控制台.日志(阶乘(1000000))结果:

阶乘(10)-3628800阶乘(100)-9 . 56860 . 68868686861阶乘(1000) -无限阶乘(10000) -无限阶乘(100000) -范围错误:最大调用堆栈大小超出了因子(1000000) -范围错误:超出了最大调用堆栈大小原文:ES6功能

版权声明:ECMAScript6新特性范例大全是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。