lrvingES6:JavaScript 新特性

旅游新闻 2020-05-15115未知admin

  我相信,在ECMAScript.next到来的时候,我们现在每天都在写的JavaScript代码将会发生巨大的变化.接下来的一年将会是令JavaScript者们兴奋的一年,越来越多的特性提案将被最终敲定,新一版本的JavaScript将会慢慢得到普及.

  本文中,我将会讲几个我个人很期待的,希望能在2013年或者更晚一点使用上的新特性.

  我们已经习惯了将我们的代码分割成为更加便于管理的功能块.在ES.next中,一个模块(module)是就是一个

  一个模块实例就是一个被求过值的模块,它已经被链接到了的模块身上或者已经有了词法上的封装数据.下面是一个模块实例的例子:

  一个模块可以使用drive(),再次用到导出相关的例子,我们现在可以有选择性的导入一些模块中的功能.

  下面,我们要讲一下模块加载器API的概念.模块加载器能够让我们动态的加载所需要的脚本.类似于export声明过的东西.

  我不打算在本文中过多的讲ES.next中的类,如果你想知道类和模块将会有什么联系,Alex Russell曾经写过一个很好的例子来说明这件事.

  JavaScript中有了类,并不意味着要把JavaScript变成Java.ES.next中的类只是我们已经熟悉的语义(比如函数,原型)的另外一种声明方式

  下面是去糖(de-sugared)后的做法,也就是我们目前正在使用的方法:

  ES.next的写法的确让代码变的更可读.这里的function,至少是做了目前我们用

  ES.next中的模块是朝着正确的方向走了一步吗?也许是吧.我自己的看法是:看相关的规范文档是事,实际上使用起来又是另事.在HarmonizrRequire HMTraceur中可以体验新的模块语法,你会非常容易的熟悉这些语法,该语法可能会觉得有点像Python的感觉(比如我认为,如果一些功能有足够广泛的使用需求(比如模块),那么平台(也就是浏览器)就应该原生支持它们.而且,并不是只有我一个人这么觉得. James Burke,发明了AMD和RequireJS的人,也曾经说过:

  我想,AMD和 RequireJS应该被淘汰了.它们的确解决了一个实际存在的问题,但更理想的情况是,语言和运行应该内置类似的功能.模块的原生支持应该能够覆盖 RequireJS 80%的使用需求,从这一点上说,我们不再需要使用任何用户态(userland)的模块加载库了,至少在浏览器中是这样.

  Isaac Schlueter前段时间也写过一些自己的想法,讲到了ES6的模块有哪些不足.尝试一下下面这些选项,看看你的想法如何.

  通过属性观察是我们经常会在MVC框架中看到的行为,它是数据绑定的一个重要组件,AngularJS和Ember.js都有自己的解决方案.

  这是一个非常重要的新功能,它不仅比目前所有框架的同类实现性能要好,而且还能更容易的观察纯原生对象.

  默认参数值(Deult parameter values)的作用是:在一些形参没有被显式传值的情况下,使用默认的初始化值来进行初始化.这就意味着我们不再需要写类似options = options {};这样的语句了.

  注:Firefox 15就已经实现了默认参数值,作者所说的18只是说18支持,并不是说18是第一个支持的版本.包括本文下面将要提到的chrome 24+等等,都有这个问题.

  块级作用域引入了两种新的声明形式,可以用它们定义一个只存在于某个语句块中的变量或常量.这两种新的声明关键字为:

  使用var可以更容易的定义一个只在某个语句块中存在的局部变量,而不用担心它和函数体中部分的同名变量有冲突.在var声明的变量和在var声明的变量没什么差别,它们都拥有函数作用域,而不是块级作用域.

  注:Firefox很久以前就支持了letconst,但这两个旧的实现都是依据了当年的ES4草案.和目前的ES6草案有些区别,比如ES4中用const声明的常量并没有块级作用域(和var一样,只是值不可变),let也有一些细微差别,就不说了.由于很少人使用旧版的Firefox(但我的主浏览器是FF3.6!),即使未来ES6和ES4中的一些东西有冲突,我们基本也可以忽略.

  我想大部分读者已经熟悉了映射的概念,因为我们过去一直都是用纯对象来实现映射的.Map允许我们将一个值映射到一个唯一的键上,然后我们就可以通过这个键获取到对应的值,而不需要担心用普通对象实现映射时因原型继承而带来的问题.

  注:我翻译过尼古拉斯的这篇文章:[译]ECMAScript 6中的类型,第二部分:Map.

  正如Nicholas Zakas在他的文章中所说,对于那些接触过Ruby和Python等语言的程序员来说,Set并不是什么新东西,但它的确是在JavaScript中一直都缺少的特性.

  任何类型的数据都可以存储在一个set中,但每个值只能存储一次(不能重复).利用Set可以很方便的创建一个不包含任何重复值的有序列表.

  Set对象的一个作用是用来降低过滤操作(filter方法)的复杂度.比如:

  这个利用Set来进行数组去重的函数的复杂度为O(n).而现有数组去重方法的复杂度几乎都为O(n^2).

  注:我翻译过尼古拉斯的这篇文章:[译]ECMAScript 6中的类型,第一部分:Set.

  该函数使用到了ES6中的for-of遍历,以及数组推导式.不过效率比使用filter去重的方法稍微差点.Firefox最新版中已经可以执行这个函数.

  另外,借助于下面将会提到的Array.from方法,还有更简单高效的写法:

  WeakMap的键只能是个对象值,而且该键持有了所引用对象的弱引用,以防止内存泄漏的问题.这就意味着,如果一个对象除了WeakMap的键以外没有任何的引用存在的话,垃圾回收器就会这个对象.

  注:我翻译过尼古拉斯的这篇文章:[译]ECMAScript 6中的类型,第三部分:WeakMap

  代理(Proxy)API允许你创建一个属性值在运行期间动态计算的对象.还可以利用代理API钩入的对象,实现例如打印记录和赋值审核的功能.

  注:作者不知道的是,一共有过两个代理API的提案,一个是旧的Catch-all Proxies,一个是新的直接代理(Direct Proxies).前者已被废弃.两者的区别在这里.V8(Chrome和Node.js)实现的是前者,Firefox18及之后版本实现的是后者(17及之前版本实现的是前者).尼古拉斯在2011年写的文章也应该是过时的.

  ===最主要的区别是在对待特殊值Object.is的判断结果是:NaN是相等的,以及+0和-0是不等的.

  注:Object.is方法和严格相等===运算符的区别体现在ES标准内部就是SameValue算法严格相等比较算法的区别.

  目前的草案也的确是这样的,但从Rick Waldron(TC39)在原文评论中给出的代码可以看出,也许Array.from未来也能将Set对象(非类数组对象,但可迭代)转换成数组.

  ES.next中添加了许多被认为是JavaScript中缺失已久的新特性.虽然ES6规范计划在2013年年底发布,不过浏览器们已经开始实现其中的一些特性了,这些特性被广泛使用也只是时间问题了.

  在ES6完全实现之前,我们可以使用一些转换编译器(transpiler)或者shim来体验其中一些特性.

  想要查看更多的例子和了解最新的信息,可以去TC39 Codex Wiki,该站点由Dave Hern和一些EC39(注:该新站仍在建设中,应该访问旧站).其中包含了下一代JavaScript中将要有的所有新特性.

原文标题:lrvingES6:JavaScript 新特性 网址:http://www.pacificcrestforaging.com/lvyouxinwen/2020/0515/24720.html

Copyright © 2002-2020 漫山遍野新闻网 www.pacificcrestforaging.com 版权所有  

联系QQ:1352848661