这篇文章主要介绍了es2015是不是es6的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇es2015是不是es6文章都会有所收获,下面我们一起来看看吧。 es2015是es6。es全称“ECMAScript”,是根据ECMA-262标准实现的通用脚本语言,而由2015年6月正式发布的版本,其正式名为ECMAScript2015(ES2015),因其是ECMAScript的第6个版本,因此可简称为es6。“es”简介es全称“ECMAScript”,是根据 ECMA-262 标准实现的通用脚本语言,ECMA-262 标准主要规定了这门语言的语法、类型、语句、关键字、保留字、操作符、对象等几个部分。每次看到 ES 后面跟着数字,是 ECMAScript 的不同版本。es6全称ECMAScript6(ECMAScript的第6个版本),是于2015年6月正式发布的JavaScript语言的标准,正式名为ECMAScript 2015(ES2015)。它的目标是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。ECMAScript 6 目前基本成为业界标准,它的普及速度比 ES5 要快很多,主要原因是现代浏览器对 ES6 的支持相当迅速,尤其是 Chrome 和 Firefox 浏览器,已经支持 ES6 中绝大多数的特性。在此后ECMA Script每年发布一个大版本新增加一些重要特性,我们称之为ES6+。本文主要总结了ES2015-ES2019的主要特性,一个学习前端的童鞋应该是常用且理解的一些特性。解决原有语法的一些不足对原有语法进行增强全新的对象、全新的方法、全新的功能Promise、Proxy、Object.assign等全新的数据类型和数据结构Symbol、Set、Map等nodejs查询浏览器查询PC浏览器对ES2015的支持情况Chrome:51 版起便可以支持 97% 的 ES6 新特性。Firefox:53 版起便可以支持 97% 的 ES6 新特性。Safari:10 版起便可以支持 99% 的 ES6 新特性。Edge:Edge 15可以支持 96% 的 ES6 新特性。Edge 14 可以支持 93% 的 ES6 新特性。IE:IE7 ~ 11 基本不支持 ES6移动端浏览器对ES2015的支持情况iOS:10.0 版起便可以支持 99% 的 ES6 新特性。Android:基本不支持 ES6 新特性(5.1 仅支持 25%)服务器对ES2015的支持情况,具体查看:https://node.green/Node.js:6.5 版起便可以支持 97% 的 ES6 新特性。(6.0 支持 92%)只有全局作用域、函数作用域,不存在严格的块级作用域存在变量提升变量的声明和定义可以分开进行变量可以重复声明存在块级作用域不能变量提升变量的声明和定义可以分开进行变量不能重复声明存在块级作用域不能变量提升变量的声明和定义必须在同一个语句中变量不能重复声明不能修改声明过的变量值(例如:可以修改对象的属性值,不能修改对象地址)最佳实践:不用var,主用const,配合let
const[foo,bar,baz]=arr console.log(foo,bar,baz) const[,,baz]=arr console.log(baz) //解构剩余的数组元素 //只能在最后一个位置使用扩展运算符 const[foo,...rest]=arr console.log(rest) //解构时元素较少,按照顺序取元素 const[foo]=arr console.log(foo) //解构时设置默认值 const[foo,bar,baz=123,more='defaultvalue']=arr console.log(bar,more)
constobj={name:'zce',age:18} //变量名重复时,可以重命名和设置默认值 constname='tom' const{name:objName='jack'}=obj console.log(objName)
支持换行符支持嵌入变量、表达式
constname='tom' //可以通过${}插入表达式,表达式的执行结果将会输出到对应位置 constmsg=`hey,${name}---${1+2}----${Math.random()}` console.log(msg)
includes 包含字符串startsWith 是否以某字符串开头endsWith 是否以某字符串结束
constmessage='Error:fooisnotdefined.' console.log( //message.startsWith('Error') //message.endsWith('.') message.includes('foo') )
在function参数后面使用=设置默认值只有当形参传递是undefined或者没有传递值时,才会设置默认值(false也不会)如果只有部分默认值,需要将设置默认值的代码放到后面;否则无法正常使用
//默认参数一定是在形参列表的最后 functionfoo(bar,enable=true){ console.log('fooinvoked-enable:') console.log(enable) } foo(false)
只能出现在形参的最后一位只能使用一次args是一个数组,区别于arguments是一个伪数组
functionfoo(first,...args){ console.log(args) } foo(1,2,3,4)
constarr=['foo','bar','baz'] //console.log( //arr[0], //arr[1], //arr[2], //) //console.log.apply(console,arr) console.log(...arr)
插件:Fira Code字体将箭头画的更好看
constarr=[1,2,3,4,5,6,7] //arr.filter(function(item){ //returnitem%2 //}) //常用场景,回调函数 arr.filter(i=>i%2)
箭头函数的简写
function(value){returnvalue}等价于value=>value
箭头函数的this指向普通函数的this指向调用它方法的对象箭头函数的this和它外面函数的this指向相同,即:箭头函数不会改变this的指向
//箭头函数与this //箭头函数不会改变this指向 constperson={ name:'tom', //sayHi:function(){ //console.log(`hi,mynameis${this.name}`)//tom,this指向该函数调用者 //} sayHi:()=>{ console.log(`hi,mynameis${this.name}`)//undefined,this和sayHi()外面的函数this相同 }, sayHiAsync:function(){ //const_this=this //setTimeout(function(){ //console.log(_this.name)//这里的this为window,所以需要使用_this //},1000) console.log(this) setTimeout(()=>{ //console.log(this.name)//这里的this指向sayHiAsync里的this,即person console.log(this) },1000) } } person.sayHi() person.sayHiAsync()
如果属性名和值的变量名相同,可以省略一个变量方法的简写:可以省略“:function”计算属性名:属性名可以在[]里面使用任意表达式
constbar='345' constobj={ foo:123, //bar:bar //属性名与变量名相同,可以省略:bar bar, //method1:function(){ //console.log('method111') //} //方法可以省略:function method1(){ console.log('method111') //这种方法就是普通的函数,this指向obj。 console.log(this) }, //Math.random():123//不允许,使用[]才行 //通过[]让表达式的结果作为属性名 [bar]:123 }
Object.assign是不完全的深拷贝?它究竟拷贝了多少东西?
获取不到obj中的get、set信息将源对象中的值赋值到目标对象目标对象和返回值是同一个对象如果目标对象中有相同名字的属性,则覆盖该属性可以传入多个源对象,按照顺序依次覆盖目标对象
constsource1={ a:123, b:123 } constsource2={ b:789, d:789 } consttarget={ a:456, c:456 } constresult=Object.assign(target,source1,source2) console.log(target) console.log(result===target)//true,目标对象和返回值是一个对象
0==false//=>true 0===false//=>false +0===-0//=>true NaN===NaN//=>false Object.is(+0,-0)//=>false Object.is(NaN,NaN)//=>true
Proxy的作用
对Object属性变化进行监听对比Object.defineProperty
Proxy属性的方法中默认调用了Reflect中的方法,例如:
constobj={ foo:'123', bar:'456' } constproxy=newProxy(obj,{ get(target,property){ console.log('watchlogic~') //Proxy中如果不写,默认调用了此方法 returnReflect.get(target,property) } })
Relect提供了统一的操作Object对象的方法,MDN上有完整的13中方法:
//console.log('name'inobj) //console.log(deleteobj['age']) //console.log(Object.keys(obj)) console.log(Reflect.has(obj,'name')) console.log(Reflect.deleteProperty(obj,'age')) console.log(Reflect.ownKeys(obj))
//class关键词 //functionPerson(name){ //this.name=name //} //Person.prototype.say=function(){ //console.log(`hi,mynameis${this.name}`) //} classPerson{ //构造函数 constructor(name){ this.name=name } //成员变量 age=18 //成员函数 say(){ console.log(`hi,mynameis${this.name}`) } } constp=newPerson('tom') p.say()
声明静态方法:static关键字调用静态方法:Person.say静态方法的thi免费云主机、域名s指向为类
//static方法 classPerson{ constructor(name){ this.name=name } say(){ console.log(`hi,mynameis${this.name}`) } staticcreate(name){ returnnewPerson(name) } } consttom=Person.create('tom') tom.say()
使用extends继承注意super的使用,能够访问父类;通常用来执行父类构造函数。
classPerson{ constructor(name){ this.name=name } say(){ console.log(`hi,mynameis${this.name}`) } } classStudentextendsPerson{ constructor(name,number){ super(name)//调用父类构造函数,否则name就没有赋值(重要) this.number=number } hello(){ super.say()//调用父类成员 console.log(`myschoolnumberis${this.number}`) } } consts=newStudent('jack','100') s.hello()
Set 没有重复元素的数组集合常用的成员方法s.add(item) 添加item,返回集合本身,可链式调用s.size 获取Set的长度s.has(item)判断是否存在某个items.delete(item)删除某个items.clear()删除全部
consts=newSet() s.add(1).add(2).add(3).add(4).add(2) //console.log(s) //s.forEach(i=>console.log(i))//forEach、for...of都可以用来遍历Set //for(letiofs){ //console.log(i) //} //console.log(s.size) //console.log(s.has(100)) //console.log(s.delete(3)) //console.log(s) //s.clear() //console.log(s)
常用来数组去重
//应用场景:数组去重 constarr=[1,2,1,3,4,1] constresult1=Array.from(newSet(arr)) constresult2=[...newSet(arr)] console.log(result1,result2)
Map 能使用复杂结构作为属性的对象集合以前的对象存储对象属性时,会将复杂数据转换成字符串(toString()方法),如下:
constobj={} obj[true]='value' obj[123]='value' obj[{a:1}]='value' console.log(Object.keys(obj)) //0:"123" //1:"true" //2:"[objectObject]"
使用Map可以存储复杂数据作为对象属性,常用的方法有如下:
constm=newMap() consttom={name:'tom'} m.set(tom,90) console.log(m) console.log(m.get(tom)) //m.has() //m.delete() //m.clear() //forEach可以遍历Map中的item m.forEach((value,key)=>{ console.log(value,key) })
一个全新的基础数据类型,每次创建都是独一无二的值
lets=Symbol(); typeofs //"symbol" lets1=Symbol('foo'); lets2=Symbol('foo'); s1===s2//false //for方法是创建的一样的值,参数会自动转换成字符串 lets3=Symbol.for('foo'); lets4=Symbol.for('foo'); s3===s4//true
可以转换为字符串,通过description(ES2019提供的方法)
lets1=Symbol('foo'); lets2=Symbol('foo'); s1//Symbol(foo) s2//Symbol(foo) s1===s2//false s1.toString()//"Symbol(foo)" s2.toString()//"Symbol(foo)" s1.description//"foo"//ES2019提供的方法
可以作为对象的属性名,可以避免同名冲突
constobj={} obj[Symbol()]='123' obj[Symbol()]='456' console.log(obj) //Symbol():"123" //Symbol():"456"
使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中,而且不能使用点运算符
lets=Symbol(); //第一种写法 leta={}; a[s]='Hello!'; //第二种写法 leta={ [s]:'Hello!' }; //以上写法都得到同样结果 a[s]//"Hello!"
可以作为对象的私有成员,不能在外部直接访问(因为每次访问都不一样),只能通过内部this访问
//案例2:Symbol模拟实现私有成员 //a.js====================================== constname=Symbol() constperson={ [name]:'zce', say(){ console.log(this[name]) } } //只对外暴露person //b.js======================================= //由于无法创建出一样的Symbol值, //所以无法直接访问到person中的「私有」成员 //person[Symbol()] person.say()
注意:for…in、Obeject.keys、Json.stringify都无法在Symbol上使用
使用:Object.getOwnPropertySymbols,替代Obeject.keys方法用于Symbol以前的 for…in 遍历键值对,forEach 存在局限性可以用使用break终止遍历,forEach不能跳出循环可以遍历Array数组、Set和Map对象普通对象不能被直接 for…of 遍历,因为它没有Symbol.iterator属性对象(Object)之所以没有默认部署 Iterator 接口,是因为对象的哪个属性先遍历,哪个属性后遍历是不确定的,需要开发者手动指定。所有可以使用 for…of 的对象都需要具有Symbol.iterator属性
//for...of循环 constarr=[100,200,300,400] //for...of循环可以替代数组对象的forEach方法但可以使用break跳出循环 arr.forEach(item=>{ console.log(item) }) for(constitemofarr){ console.log(item) if(item>100){ break } } //forEach无法跳出循环,必须使用some或者every方法 //arr.forEach()//不能跳出循环 //arr.some() //arr.every() //遍历Set与遍历数组相同 consts=newSet(['foo','bar']) for(constitemofs){ console.log(item) } //遍历Map可以配合数组结构语法,直接获取键值 constm=newMap() m.set('foo','123') m.set('bar','345') for(const[key,value]ofm){ console.log(key,value) } //普通对象不能被直接for...of遍历 constobj={foo:123,bar:456} for(constitemofobj){ console.log(item) }
一些数据结构的原型对象 _ proto _ 中含有Symbol.iterator方法iterator方法返回一个带next()方法的指针对象每次执行next()方法,它都会返回下一个数据具有 Symbol.iterator 属性的数据结构Array、Map、Set、String、TypedArray、函数的 arguments 对象、NodeList 对象iterator 的遍历过程是这样的。(1)创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。(2)第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。(3)第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。(4)不断调用指针对象的next方法,直到它指向数据结构的结束位置。使对象能够使用 for…of
constobj={ //使用计算属性,用[]存表达式属性名 //1、Iterable,对象必须要有一个Symbol.iterator属性 [Symbol.iterator]:function(){ return{ //2、Iterator,返回的对象有一个next()方法 next:function(){ //3、IterationResult,next()方法返回一个对象 return{ value:'zce', done:true } } } } } for(constitemofobj){ console.log('循环体',item) }
使对象能够使用 for…of,完整的代码
constobj={ store:['foo','bar','baz'], [Symbol.iterator]:function(){ letindex=0 constself=this return{ next:function(){ constresult={ value:self.store[index], done:index>=self.store.length } index++ returnresult } } } } for(constitemofobj){ console.log('循环体',item) }
迭代器模式(设计模式之一)
迭代器模式(设计模式之一)迭代器的另外一个主要用途:迭代器模式数组的includes方法
//Array.prototype.includes----------------------------------- constarr=['foo',1,NaN,false] //找到返回元素下标 console.log(arr.indexOf('foo')) //找不到返回-1 console.log(arr.indexOf('bar')) //无法找到数组中的NaN console.log(arr.indexOf(NaN)) //直接返回是否存在指定元素 console.log(arr.includes('foo')) //能够查找NaN console.log(arr.includes(NaN))
指数运算符
//指数运算符--------------------------------------------------- console.log(Math.pow(2,10)) console.log(2**10)
Object.values —— 类似Object.keys,返回对象的值数组
Object.entries —— 以数组的形式返回对象中的键值对,结合for…of可以遍历obj
constobj={ foo:'value1', bar:'value2' } //Object.values----------------------------------------------------------- console.log(Object.values(obj)) //Object.entries---------------------------------------------------------- console.log(Object.entries(obj)) //比iterator更简单,直接先将obj转换成数组,再使用for...of for(const[key,value]ofObject.entries(obj)){ console.log(key,value) } console.log(newMap(Object.entries(obj)))
Object.getOwnPropertyDescriptors —— 获取对象属性的完整信息,主要配合ES5的get、set使用
Object.assign 获取不到set、get信息
constp1={ firstName:'Lei', lastName:'Wang', getfullName(){ returnthis.firstName+''+this.lastName } } //console.log(p1.fullName) //constp2=Object.assign({},p1) //p2.firstName='zce' //console.log(p2) constdescriptors=Object.getOwnPropertyDescriptors(p1) //console.log(descriptors) constp2=Object.defineProperties({},descriptors) p2.firstName='zce' console.log(p2.fullName)
String.prototype.padStart / String.prototype.padEnd
constbooks={ html:5, css:16, javascript:128 } //for(const[name,count]ofObject.entries(books)){ //console.log(name,count) //} for(const[name,count]ofObject.entries(books)){ console.log(`${name.padEnd(16,'-')}|${count.toString().padStart(3,'0')}`) }
constarr=[ 100, 200, 300, 400, ] constarr=[ 100, 200, 300 ]
来自于ES2017标准;async、await能够更方便的进行异步编程,且通常需要成对使用;1、async、await相对于generate函数升级提升的地方:(1)内置执行器(2)更好的语义(3)更好的扩展器(4)返回值是promise2、async、await的返回值(1)async的返回值是promise对象;但是需要注意:1、async函数返回一个 Promise 对象。
2、async函数内部return语句返回的值,会成为then方法回调函数的参数。
asyncfunctionf(){ return'helloworld'; } f().then(v=>console.log(v)) //"helloworld"
(2)await返回值根据后面的参数不同而不同,有两种;3、await 后面的参数(1)await后面跟一个promise对象;=> 返回promise对象的结果;(2)await后面跟一个值;=> 直接返回该值;4、错误处理方法如果await后面的promise异步操作出错,那么等同于async函数返回的 Promise 对象被reject。最好把await命令放在try…catch代码块中
asyncfunctionf(){ awaitnewPromise(function(resolve,reject){ thrownewError('出错了'); }); } f() .then(v=>console.log(v)) .catch(e=>console.log(e)) asyncfunctionmyFunction(){ try{ awaitsomethingThatReturnsAPromise(); }catch(err){ console.log(err); } } //另一种写法 asyncfunctionmyFunction(){ awaitsomethingThatReturnsAPromise() .catch(function(err){ console.log(err); }); }
5、并发/循环异步请求的处理(1)如果是串行执行异步请求,需要同步等待,会比较耗时;
letfoo=awaitgetFoo(); letbar=awaitgetBar(); //1、循环里面的串行执行: asyncfunctiondbFuc(db){ letdocs=[{},{},{}]; for(letdocofdocs){ awaitdb.post(doc); } } //2、错误的串行执行:?why?思考?forEach里面的async应该是异步同时执行的,没有await? functiondbFuc(db){//这里不需要async letdocs=[{},{},{}]; //可能得到错误结果 docs.forEach(asyncfunction(doc){ awaitdb.post(doc); }); }
(2)并行执行——等待所有响应,再执行下一个步骤;
asyncfunctiondbFuc(db){ letdocs=[{},{},{}]; letpromises=docs.map((doc)=>db.post(doc)); letresults=awaitPromise.all(promises); console.log(results); } //或者使用下面的写法 asyncfunctiondbFuc(db){ letdocs=[{},{},{}]; letpromises=docs.map((doc)=>db.post(doc)); letresults=[]; for(letpromiseofpromises){ results.push(awaitpromise); } console.log(results); }
(3)并行执行——不等待所有响应,回来一个回调一个;
//可以不要在for里面await;也不要写成串行的回调; //是在for里面写异步方法的调用?例如: letdocs=[{},{},{}]; for(letdocofdocs){ db.post(doc).then((res)=>{}); }
6、async、await原理(利用generator实现async、await)async、await底层封装起来了看不见代码实现
可以利用iterator或者generator函数,进行封装实现;参考代码:(未完待续)6+1 种原始数据类型 + bigInt(下个版本)nullundefinednumberstringbooleanSymbol(ES2015)BigInt(stage-4,下个版本出标准化)关于“es2015是不是es6”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“es2015是不是es6”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注云技术行业资讯频道。
本文小编为大家详细介绍“vue怎么全局替换div值”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue怎么全局替换div值”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 首先,我们需要创建一个简单的 Vue 实例,并将其绑定到一个…