简述ES5 ES6
很久前的某一天,一位大神问我,你知道ES6相对于ES5有什么改进吗?
我一脸懵逼的反问,那个啥,啥是ES5、ES6啊。
不得不承认与大神之间的差距,回来深思了这个问题,结合以前的知识,算是有了点眉目。
JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,我们知道javascript的三个基本组成部分是ECMAJavascript(European Computer Manufacturers Association javascript,也就是前面说的ES,但之前你问我ES5orES6我就真懵逼了),BOM,DOM,es可以看出是javascript的前身,是javascript的内核定义用法,而所有前端框架、ui库都是基于javascript的,也就是用原生js写的,ES的重要性不言而喻,如果你习惯用轮子,比如各种jqueryui,平时也很少用js写东西,对这个就不很很了解,如果你是大牛,经常造轮子写东西,github上start一片,博客上粉丝众多,就必然对这要有很深的研究,不然写的东西没有深度的。
ES5和ES6从字面上理解是一个升级的过程,出了一代新标准,发展迅速的it行业,去了解和适应一种新标准用法很有必要,这也是我为什么选择写这个主题;想要了解一些原始的定义和由来,我则建议你阅读一些相关的资料,解释了EScript的前世今生,给大家科普一段:
Ecma标准建立在一些原本的技术上,最为著名的是JavaScript(网景)和JScript (微软)。语言由网景的Brendan Eich发明而第一次出现在这个公司的Navigator .0浏览器上。它出现在所有Netscape后来的浏览器以及微软从Internet Explorer .0之后的所有浏览器上。 这一标准的编制自1996年十一月开始。这一Ecma标准的第一个版本被1997年六月的Ecma General Assembly采纳。 上述Ecma标准被以快速跟进流程提交至ISO/IEC JTC ,并作为于1998年四月作为ISO/IEC 16262通过。1998年六月Ecma General Assembly通过了ECMA-262第二版以保持它与ISO/IEC 16262的完全一致性。第一版到第二版的变更仅仅是编辑性质的。 第三版标准引入了强大的正则表达式,更佳的字符串处理,新的控制语句,try/catch异常处理,更严密地错误定义,格式化的数字输出以及一些为国际化和未来语言成长预留的小变更。ECMAScript标准的第三版1999年十二月的Ecma General Assembly采纳并于2002年六月作为ISO/IEC :2002发布。 自第三版发布以来,ECMAScript因其与万维网的关联而获得了广泛采用,它已经成为所有web浏览器实质上都提供的一种编程语言。为了编制第四版ECMAScript,有很多有意义的工作。尽管这工作没能完成而且也没有作为ECMAScript的第四版发布,它促进了语言的进化。ECMAScript第五版(发布为ECMA- 5th edition)纸面化了很多事实上已经在浏览器形成共识的语言规范解析并且增加了对自第三版发布以来的新功能的支持。这些功能包括访问器属性,反射创建以及对象检测,属性特性的程序控制,新增的数组操作函数,JSON对象编码格式,以及提供了改进的错误检查以及程序安全性的严格模式。 这一ECMAScript .1版本标准完全与国际标准ISO/IEC :2011的第三版本一致。 ECMAScript是一个充满活力的语言,而且语言的演进尚未完成。有意义的技术性增强将会在未来版本的规范中持续进行。 这一Ecma规范由2011年六月Ecma General Assembly采纳 --ES5
需要注意的是,EScript之前的更新迭代版本叫法都是按照ESx来的,而ES6的叫法实际上是延续了这个习惯,截止发布日期,JavaScript的官方名称是ECMAScript 2015,Ecma国际意在更频繁地发布包含小规模增量更新的新版本,下一版本将于2016年发布,命名为ECMAScript 2016。以后的更新中,新版本将按照ECMAScript+年份的形式发布,ecmascript2015官方说明。近年来更新的频率越来越高,也反映了这一语言的发展迅速,功能越来越强,作为和这些紧密相关的码农大神们也要持续的学习跟进啊。
ES6在2015年发布,相对于上一版本,加入了很多新特性,ES5无从说起(不知道从哪说起,就是平时码的javascript吧),所以就说下ES6的新特性吧,ES6的新特性有:let, const, class, extends, super, arrow functions, template string, destructuring, default, rest arguments;
相关的详细说明大家可以翻阅官网说明,下面我也会举一些小例子帮助理解;
let,const
用法和var类似,定义变量,不同的是let为javascript增加了块级作用域,声明只在所在代码块有效,不影响作用域外的同名变量;你可以尝试码下
let name="x";
if(true){
let name="y";
alert(name);
}
alert(name);
你会发现网页会依次打印y和x,如果是var声明,name会被重新赋值;const也是声明,不同的是const声明后的值不可更改,也即readonly,这个用的地方很少吧,为避免冲突的场景可以使用,以免报错;
class,extends,super
在ES6之前,原型、构造函数、继承对于大多说人来说是个麻烦点(一直到现在,我还经常去翻工具书...),而ES6中的class,extends,super很大程度上改观了这个问题,比如之前关于构造函数、继承可能这样写:
function Person(name,job){
this.name="personA";
this.job="work";
this.dowhat=function(this.job){
alert(this.name+" should "+this.job)
}
}
var person=new Person("personB","player");
es相对于编程语言是弱类型,一个var可以声明一切,然后在声明的对象中通过原型继承来衍生其他方法,作为习惯强类型语言的我常常在理解上出错,而结合class,extends,super的es6原型写法更清晰、更偏向面向对象的写法:
class Person{
constructor(){
this.name="Person"
}
dowhat(todo){
alert(this.name+" Should "+todo);
}
}
let person=new Person();
person.dowhat("work");
class Boy extends Person{
constructor(){
super();
this.name="Boy"
}
}
let boy=new Boy();
boy.dowhat("go to school");
(ps:博客园为毛不提供在线测试的功能,一点击就运行测试,就不用复制了,还是我没发现这个功能?)
面向对象的思想有木有!有木有!有木有!通过class类定义创造一个“类”,并且有构造函数constructor,而this对象代表实例对象,构造函数定义自身的方法和属性,构造函数外的方法和属性通过继承可以共享,class之间通过extends实现继承,Boy通过extends继承了Person定义的方法和属性,比ES5好理解的多,而super这里代指父级的示例(this),子类必须在构造函数中调用super,否则在新建实例的时候会报错,ES6的继承机制,实质是先创造父类的实例对象this,通过super的调用,实现子类的继承和修改。
Arrow Function
字面理解就是箭头功能,什么鬼;一种用箭头“=>”来定义函数的新语法,简单示范:
var sum = (num1, num2) => num1 + num2;
//等同于
function sum(num1,num2){
return num1+num2
}
它的功能不止于写法简便,与传统的js写法主要区别是,对 this 的关联,函数内置 this 的值,取决于箭头函数在哪儿定义,而非箭头函数执行的上下文环境。
template string
字面理解也即是模板字符串了,实际它的作用也是在插入比较多的html模板内容时候使用的,比如传统的拼接是这样的:
$(".class p").append(
"There are <b>" + count + "</b> " +
"items in your basket, " +
"<em>" + onSale +
"</em> are on sale!"
);
使用template string 是这样的:
$(".class p").append(`
There are <b>${count}</b> items
in your basket, <em>${onSale}</em>
are on sale!
`);
用反引号(`)
来标识起始,用${}
来引用变量,并且会保留引用中的空格和缩进,比拼接方便多了。
destruturing
//直接上码
var boy="lilei";
var girl="hanmeimei";
var human={boy:boy,girl:girl};
console.log(human) //Object {boy: "lilei", girl: "hanmeimei"} //destructuring
var boy="lilei";
var girl="hanmeimei";
var human={boy,girl};
console.log(human) //Object {boy: "lilei", girl: "hanmeimei"}
也即是,ES6中允许按照一定的模式,从数组和对象中取值和赋值,就就是destruturing。
default
ES6中允许为函数设置默认值,这个很好理解:
function log(x, y = 'world') {
console.log(x, y);
}
log('Hello'); // Hello world
log('Hello', 'China'); // Hello China
log('Hello', ''); // Hello
rest
休息?这个理解也比较容易,上来就懂:
function person(...types){
console.log(types)
}
person('lilei', 'hanmeimei', 'lili') //['lilei', 'hanmeimei', 'lili']
先写到这里吧,可能有理解上的误区,欢迎小伙伴们指正,以后再来慢慢补全修正。
中秋节到了,祝大家中秋节快乐,马上来的国庆节快乐!
原文地址:简述ES5 ES6,薛陈磊 | Share the world
简述ES5 ES6的更多相关文章
- Atitit js版本es5 es6新特性
Atitit js版本es5 es6新特性 Es5( es5 其实就是adobe action script的标准化)1 es6新特性1 Es5( es5 其实就是adobe action scrip ...
- React/React Native的 ES5 ES6 写法对照
ES5 ES6 模块 var React = require("react-native); var { Image, Text, View } = React; import Re ...
- Atitit js es5 es6新特性 attilax总结
Atitit js es5 es6新特性 attilax总结 1.1. JavaScript发展时间轴:1 1.2. 以下是ES6排名前十的最佳特性列表(排名不分先后):1 1.3. Es6 支持情况 ...
- 【转】React Native中ES5 ES6写法对照
很多React Native的初学者都被ES6的问题迷惑:各路大神都建议我们直接学习ES6的语法(class Foo extends React.Component),然而网上搜到的很多教程和例子都是 ...
- 【ES5 ES6】使用学习
[ES5 ES6]使用学习 转载: ============================================================= 1.Promise 2.下划线转驼峰,驼 ...
- JavaScript Learning Paths(ES5/ES6/ES-Next)
JavaScript Learning Paths(ES5/ES6/ES-Next) JavaScript Expert refs https://developer.mozilla.org/en-U ...
- React Native 的ES5 ES6写法对照表
模块 引用 在ES5里,如果使用CommonJS标准,引入React包基本通过require进行,代码类似这样: //ES5 var React = require("react" ...
- ES5/ES6的区别研究(ECMAScript)
我所理解的概念应该是语法的区别和特性的区别 这里是ECMAScript的解析http://baike.baidu.com/item/ECMAScript 参考: (ES6)http://es6.rua ...
- React/React Native 的ES5 ES6写法对照表
//es6与es5的区别很多React/React Native的初学者都被ES6的问题迷惑:各路大神都建议我们直接学习ES6的语法(class Foo extends React.Component ...
随机推荐
- 循序渐进做项目系列(1):最简单的C/S程序——让服务器来做加法
(本文是专门针对未接触过C/S开发的初学者而写的,C/S开发高手请自动忽略啊~~) 还在写“Hello world!”式的单机程序吗?还在各种拖控件吗?是否自己都觉得有点low呢?来个质的飞跃吧!看看 ...
- google map javascript api v3 例子
之前一直用百度map,但如果是国外的项目就需要用google地图.由于在国内屏蔽了google地图的服务,因此调用的是一个国内地址(开发用).这个地址没有用key,语言设置也还是中文的. //---- ...
- 基于百度翻译API开发属于自己的翻译工具
你是否每天使用着网页翻译工具?你是否遇到过这种情况,上网过程中遇到一个很长的单词但是又不能复制,要开两个浏览器,一个打开百度翻译,照着另一个网页输入单词?你安装了各种翻译软件后,又删除,只因忍受不了那 ...
- 【摘选引用】在安全的SQL 密码也不过如此
SQL密码再安全也禁不住破解!!! http://www.sqlservercentral.com/articles/password+cracking/96540/ 备注:[摘选引用]是本人日常收集 ...
- FB引擎系列-之CloudSand
CloudSand,欲打破之前的集中版本制作的模式, http://code.taobao.org/p/cloudsand包含服务器端代码(php)和客户端代码(unity) EasyDown的时 ...
- 你不可不知的HTML优化技巧
如何提升Web页面的性能,很多开发人员从多个方面来下手如JavaScript.图像优化.服务器配置,文件压缩或是调整CSS. 很显然HTML 已经达到了一个瓶颈,尽管它是开发Web 界面必备的核心语言 ...
- sql的OUTER APPLY
今天写一个查询sql,其中涉及到一个银行卡绑定表(表名:BankBind),我要将这个表的开户行字段的值进行分割出省份.支行, 这个开户行字段存储的值如“广东省广东省分行江门市分行恩平市支行”.“招商 ...
- Atitit 马尔可夫过程(Markov process) hmm隐马尔科夫。 马尔可夫链,的原理attilax总结
Atitit 马尔可夫过程(Markov process) hmm隐马尔科夫. 马尔可夫链,的原理attilax总结 1. 马尔可夫过程1 1.1. 马尔科夫的应用 生成一篇"看起来像文章的 ...
- flow.ci + Github + Slack 一步步搭建 Python 自动化持续集成
理想的程序员必须懒惰,永远追随自动化法则.Automating shapes smarter future. 在一个 Python 项目的开发过程中可能会做的事情:编译.手动或自动化测试.部署环境配置 ...
- c#设计模式-观察者模式
Observer 与 Subject 互为耦合,但是这种耦合的双方都依赖于抽象,而不依赖于具体. 一.观察者模式 目的 我们都知道解决一个问题有N种解决方式,但在面向对象的设计中如何能做到“高内聚,低 ...