es6常用语法总结
来源:互联网 发布:淘宝化妆品店铺推荐 编辑:程序博客网 时间:2024/05/29 08:37
es6作为新规范,为我们带来了许多便利的新特性,而这些特性数量繁多,想要完全掌握估计得花不少时间。为此,我总结了es6中一些常用或常见的特性和功能,大家不妨先看一看。
const和let
以往,我们在声明变量时使用的都是var关键字,而在es6中,我们不仅能使用新的let关键字声明变量,还能使用const关键字声明常量。
常,有经久不变的意思,而常量则相对于变量,是不会被改变的量。如:const foo=1,正常情况下这个foo的值永远都是1,只要声明了,就无法改变。而通过let声明的是变量,是能够被改变的。
可能很多人会问,既然用var就能创建变量了,为什么还要用let呢?
答案很简单,因为他们声明的变量的作用域不一样。
通过var关键字创建的变量作用域为函数作用域,通俗来讲就是以函数来区分有效范围;而通过let关键字创建的变量作用域为块级作用域,通俗来讲就是以{}来区分有效范围。
比如说,在for、switch或者if里,我们声明的变量不想被其他地方访问到,这时候let关键字就能很好地为我们解决问题了。
模板字符串
在渲染数据时我们常常用到模板,但传统的字符串拼接非常复杂且容易出错,维护性较差。不过,也因此衍生出了出各种各样的模板引擎,比如说我常用的baiduTemplate。
但是,模板引擎毕竟是第三方插件,作为有追求的开发者,第三方的东西当然是能不用就不用了。这时候,就该是我们的es6反引号登场了。
在es6中,我们能通过反引号来拼接字符串(反引号一般在键盘esc键的下方)、${}嵌入变量。
如:
let txt='hello es6';let html=` <div class="wrap"> <div class="inner">${txt}</div> </div>`;document.body.innerHTML=html;
箭头函数
箭头函数是es6中新增的一种定义函数的方法,与function关键字的区别除了写法以外,最大的不同在于this的指向。
//function关键字定义函数function bar( arg ){ content };var bar=function( arg ){ content };//箭头函数let bar=( arg )=>{ content };//this指向对比let obj={ foo:function(){ console.log(this); }, bar:()=>{ console.log(this); }};obj.foo(); //objobj.bar(); //window
由于function关键字定义的函数是在执行时绑定this指向的,所以this指向调用她的对象obj;而箭头定义的函数是在定义时绑定this指向的,箭头函数定义时的上下文是window.obj.bar,自然this指向的就是window了。
我们可以利用这个特性使一些操作变得方便。
如:
let obj={ num:6, baz:functiton(){ (()=>{ console.log(this.num); })(); }};obj.baz(); //6
对象的省略写法
//以往的写法let a=0;let obj={ a:a};//对象中key和值变量是一样的话,可以进行省略let a=0;let obj={ a};
//函数也能省略let obj={ bar(){ console.log(this); } };obj.bar();
Object新方法
Object.keys()方法能够列举对象的键,参数为对象,返回该对象的键所组成的数组。
//Object.keys()let obj={ a:0, b:1, c:2};let arr=Object.keys(obj);console.log(arr); //['a','b','c']
Object.assign()方法能够合并两个对象,用法与数组的concat方法差不多:第一个参数为主要合并对象,第二个参数为被合并对象。
//Object.assign()let obj={ a:0, b:1, c:2};let obj2={ b:6, d:3};Object.assign(obj,obj2);let arr=Object.keys(obj); //['a','b','c','d']console.log(obj.b); //6
从上面的例子中可以看到,如果合并的两个对象拥有相同的键,主对象的键的值会被替换掉。
class(类)
在js中,虽然可以通过构造函数创建类,但这种构造方式不直观,没有语义,对初学者来说可能不太好理解。为此,es6中新增了class构建类的方法。
class Foo{ constructor(a,b){ this.a=a; this.b=b; } bar(){ console.log(this.a+this.b); }};let foo=new Foo(1,2);foo.bar(); //3
使用class方法构造类,语义清晰,class关键字直接跟上类名、花括号,而构造则由constructor方法来实现,其他类方法与constructor平级创建即可。实例化的话跟以往一样,还是使用new关键字创建。
创建过程非常直观,但有一点需要注意,class构造的类的花括号里具有固定写法:方法创建必须使用简写:方法间不需要也不能用任何分隔符。
另外,类里面的所有方法都绑定到prototype属性上,我们可以通过这个属性访问这些方法。
继承方面,class创建的类继承起来特别简单,只要使用extends关键字就可以了。
class Foo{ constructor(a,b){ this.a=a; this.b=b; } bar(){ console.log(this.a+this.b); }};class Baz extends Foo{ constructor(a,b,c){ super(a,b); this.c=c; } foobar(){ console.log(this.a+this.b+this.c); }};let baz=new Baz(1,2,3);baz.bar(); //3baz.foobar(); //6
class 类名 extends 父类名的方式就能实现继承,在constructor中使用super方法把参数传给父类。
回想起以往使用call传参继承,之后还要另外使用prototype继承方法,这种继承办法真的方便太多了。
Object.defineProperty()
这其实也算是Object对象新增的方法,但由于内容比较多,所以单独拿出来讲。
Object.defineProperty()的主要作用是:为目标对象添加或修改属性。不过,这种方法除了能够处理属性的值以外,还能设置各种特性。
首先我们来看看她是怎么写的:
Object.defineProperty(目标对象,需要设置的属性键,{ value:值, writable:布尔值, enumerable:布尔值, configurable:布尔值, get:function(){}, set:function(){}});
从上述例子可以基本了解到defineProperty方法的写法和参数。
Object.defineProperty方法的参数有三个: 1、目标对象;2、为对象设置的属性名(key);3、目标属性特征的设置项(descriptor)。
descriptor对象里一共有六个属性可以设置:
value:设置属性的值;
writable:设置属性是否能被修改,true为能够被修改、false为不能被修改;
enumerable:设置目标属性是否能被枚举,true为能被枚举、false为不能被枚举;
configurable:设置目标属性是否能被delete关键字删除以及目标属性的特性能否被再次设置;
get:获取目标属性时触发该函数;
set:设置目标属性时触发该函数。
注:当使用get和set时,不能使用value和writable这两个属性。
下面贴上几个例子:
//为对象添加属性和值let obj={};Object.defineProperty(obj,'a',{ value:1});console.log(obj.a); //1//修改目标属性的值let obj={ a:1};Object defineProperty(obj,'a',{ value:2});console.log(obj.a); //2
//设置属性不能被修改let obj={};Object.defineProperty(obj,'a',{ value:1, writable:false});obj.a=2;console.log(obj.a); //1//设置属性能被修改Object.defineProperty(obj,'a',{ value:1, writable:true});obj.a=2;console.log(obj.a); //2
//设置目标属性为不可被枚举let obj={};Object.defineProperty(obj,'a',{ value:1, enumerable:false});console.log(Object.keys(obj)); //[]//设置目标属性能够被枚举let obj={};Object.defineProperty(obj,'a',{ value:1, enumerable:true});console.log(Object.keys(obj)); //['a']
//设置为不能再设置特性let obj={};Object.defineProperty(obj,'a',{ value:1, configurable:false});Object.defineProperty(obj,'a',{ value:2,});console.log(obj.a); //报错//设置为能再次设置特性let obj={};Object.defineProperty(obj,'a',{ value:1, configurable:true});Object.defineProperty(obj,'a',{ value:2,});console.log(obj.a); //2
//set和get的一种应用function getEl(id){ return document.getElementById(id);};const oBox=getEl('box'),oBox2=getEl('box2'),oBtn=getEl('btn');let obj={};Object.defineProperty(obj,'a',{ get:function(){ return oBox.textContent; //4.get函数被触发,返回oBox的文本内容;另外值得注意的是,由于此时set函数里并没有设置a的值,所以无法返回没有的东西(无法return a) }, set:function(val){ oBox.textContent=val; //2.set函数被触发,改变oBox的文本内容 }});oBtn.addEventListener('click',function(e){ obj.a=1; //1.点击按钮设置obj的a属性,触发set函数 oBox2.textContent=obj.a; //3.点击按钮获取obj的a属性,触发get函数,get函数返回值,改变oBox2的文本内容},false);
本文中的几个新特性都是个人觉得比较常见或常用的,感兴趣或者有需要的不妨再深入研究一下。
最后提一下,由于现在浏览器对es6的支持并不理想,写完后记得用babel转一下码噢。
- es6常用语法总结
- ES6中的常用语法总结
- ES6常用的一些语法总结
- es6常用的语法
- ES6常用语法
- es6常用语法
- ES6常用语法
- ES6语法学习总结
- ES6语法总结
- 快速了解ES6常用语法
- ES6/ES2015常用语法 (上)
- es6常用方法总结
- es6常用知识总结
- ES6常用新特性总结
- es6常用特性学习总结
- ES6/ES2015常用语法(下)
- es6的常用语法和优越性
- Es6的常用语法和优越性
- 一头扎进Maven3 (二)
- SpringMvc(2)
- 1305判断是否为对称字符串
- EJS模板中,js如何获取后端传来的数据
- HTML-表格表单篇
- es6常用语法总结
- KMP算法原理
- 稳压电源 连载8:简单稳压电源2-使用调整管稳压;
- TextView首行缩进
- ThinkPHP5.1 数据库查询数据 定义淘宝风格的路由URL
- 《从Paxos到Zookeeper:分布式一致性原理与实践》【PDF】下载
- 回文链表 请编写一个函数,检查链表是否为回文。 给定一个链表ListNode* pHead,请返回一个bool,代表链表是否为回文。 测试样例: {1,2,3,2,1} 返回:true {1,2,3,
- 018 参数估计之点估计法:矩估计法、最大似然估计
- 洛谷P3313 [SDOI2014]旅行