JavaScript十二月新标准ECMA262v5快速浏览
发布时间:2009-12-27 12:56:00
今天终于抽出时间瞟了一眼JavaScript的新标准ECMA262v5,让我欣喜的是,不像是因为过于激进而被废除的v4,这个新标准对JavaScript保留了ECMA262v3时代大部分的语言特性,把重点放在了修补旧标准中被人诟病的问题上,而且加入了许多令人期待的新特性和新功能。因为我还没有很深入研究,这里仅仅是分享我快速浏览时看到的一些主要的亮点和变化,请不要把本文当作一个全面的新旧标准对比,也欢迎大家补充。
1.文档得到改进,官方版本PDF文件带了索引,目录也有了链接。
(虽然跟语言无关……)这份文档使用了pdf的更多特性,阅读起来较之v3方便了不少。
2.v3中描述暧昧的scope chain的概念被去掉,引入了全新的执行上下文概念来解释动态的变量作用域。
scope chain在ECMAv3中一直是块难啃的骨头,本身标准的描述就不够清晰,再加上动态作用域的实现又有些难以理解,很多人都一直因为scope chain问题而苦恼。在v5中,变量作用域的概念被完全更新,采用上下文和outer上下文的概念来解释这个问题。比起原来向scope chain中加入Activation Object的解释方法,这种描述令实现更自由(上下文对象不一定是JavaScript对象,而Activation Object一定是JavaScript对象)
3.引入了strict模式,strict模式提供了禁用一些语言特性以提升性能的潜在可能。
根据我目前的推断,在strict模式模式下JavaScript的变量应该是可以实现为静态寻址的。众所周知,JavaScript运行效率低的原因之一就是动态的变量声明和变量名查找导致的效率问题,而新的标准引入了strict模式使得这一问题得以根本解决,在一些多次调用的核心代码中使用strict模式将大大提高JavaScript的运行效率。当然这些特性还要求语言实现者提供相应支持才行。
4.eval和arguments做为标识符受到了限制。
我想是为了弥补v3将eval和arguments做为普通标识符带来的问题,v5在各个地方都对eval和arguments作出了限制,对它们进行赋值等操作会导致抛出运行时异常。我个人认为现在基本可以将它们等同于关键字看待。
5.JSON被引入标准中
JSON的概念被正式引入了v5,并且有了标准的词法和语法定义。同时,新标准也提供了不同层面内置类型方法来支持JSON,包括Date的toJSON和新引入的JSON对象。
6.引入了属性类型,对象模型描述更加清晰
新标准引入了两种Property类型,一种是普通的存储Value的property,另一种是有Getter和Setter的属性。而v3中略显含糊的对象是“属性无序集合”的概念,随着这样的定义也变得很清晰。
7.引入了Error的子类型
所有Error不再属于同一个Error类型,EvalError, RangeError, ReferenceError, SyntaxError, TypeError 以及 URIError 被引入语言中。
8.更多内置类型的方法
下面是一份新标准中给出的新添加内置类型以及属性列表:
Object.getPrototypeOf, Object.getOwnPropertyDescriptor, Object.getOwnPropertyNames, Object.create, Object.defineProperty, Object.defineProperties, Object.seal, Object.freeze, Object.preventExtensions, Object.isSealed, Object.isFrozen, Object.isExtensible, Object.keys, Function.prototype.bind, Array.prototype.indexOf, Array.prototype.lastIndexOf, Array.prototype.every, Array.prototype.some, Array.prototype.forEach, Array.prototype.map, Array.prototype.filter, Array.prototype.reduce, Array.prototype.reduceRight, String.prototype.trim, Date.now, Date.prototype.toISOString, Date.prototype.toJSON.
我们看到,这份列表中包括了我们期待以久的很多方法。Object扩展实际上开放了更多v3中不可访问的对象特性,包括getter setter enumerable等等都可以。而Array扩展则引入了期待以久的集合操作(比如著名的forEach)。Date.now则是一个小小的修补,比起new Date看起来舒服一些。Function.prototype.bind也在列表当中,这个新的内置函数提供了比目前一些流行的bind更完善和高效的绑定thisValue功能,而且还顺便提供了绑定参数,这是变相的currying实现。
猜你喜欢
- 最近认识了一个做Python语音识别的朋友,聊天时候说到,未来五到十年,Python人工智能会在国内掀起一股狂潮,对各种应用的冲击,不下于淘
- 如何显示数据库的结构?<html><head><meta http-equiv="Cont
- 大数据一般是在“云”上玩的,但“云”都是要钱的,而且数据上上下下的也比较麻烦。所以,在本地电脑上快速处理数据的技能还是要的。pandas在比
- 本文实例讲述了Python 类的私有属性和私有方法。分享给大家供大家参考,具体如下:xx:公有变量_xx:公有变量或方法,不能通过impor
- 一、python图形界面tk之滚动文本框的实现示例使用python的tkinter库实现滚动文本框的方式,目前我知道的有两种,一
- 如题,首先当然是要打开京东的手机页面因为要获取不同页面的所有手机图片,所以我们要跳转到不同页面观察页面地址的规律,这里观察第二页页面由观察可
- Json模块dumps、loads、dump、load函数介绍1、json.dumps() json.dumps()用于将dict
- 前几天网上找了一款 PC 端微信自动清理工具,用了一下,电脑释放了 30GB 的存储空间,而且不会删除文字的聊天记录,很好用,感觉很多人都用
- 目录前言1. 使用Lambda来修改Pandas数据框中的值2. 使用f-string来连接字符串3. 用Zip()函数对多个列表进行迭代4
- 当我们使用访问一个没有声明的变量时,JS会报错;而当我们给一个没有声明的变量赋值时,JS不会报错误,相反它会认为我们是要隐式申明一个全局变量
- python中,A object = B object 是一种赋值操作,赋的值不是一个对象在内存中的空间,而只是这个
- 知识点:字符串在编程里,用的最多的就是字符串,字符串同时也是各类数据的中转站字符串运算符:编号运算符类型说明1+字符串拼接2*同一字符串多次
- 桑基图简介很多时候,我们需要一种必须可视化数据如何在实体之间流动的情况。例如,以居民如何从一个国家迁移到另一个国家为例。这里演示了有多少居民
- vue-cli-service build 环境设置使用vue-cli3打包项目,通过配置不同的指令给项目设置不一样的配置。npm run
- 2012年,AlexNet横空出世。它首次证明了学习到的特征可以超越手工设计的特征。它一举打破了计算机视觉研究的现状。AlexNet使用了8
- 引言您是否能编写命令行工具?也许您可以,但您能编写出真正好用的命令行工具吗?本文讨论使用 Python 来创建一个强健的命令行工具,并带有内
- 本文实例为大家分享了JS+DIV实现拖动效果的具体代码,供大家参考,具体内容如下效果图思路代码<!DOCTYPE html>&l
- 前言前面在 BeanShell 里面是通过 java 脚本实现请求的预处理,jmeter里面也可以调用python的脚本,需安装 jytho
- 本文介绍了微信小程序滑动选择器的实现代码,分享给大家,具体如下:实现微信小程序滑动选择效果在wxml文件中,用一个picker标签代表选择器
- 变量存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存