这篇文章涵盖了 Firefox 3 中的新特性
JavaScript 1.8 是 Gecko 1.9(已合并在 Firefox 3 中)的一部分。比起 JavaScript 1.7 ,这只是很小的更新,不过它也确实包含了一些向 ECMAScript 4/JavaScript 2 升级的痕迹。JavaScript 1.8 还将包含 JavaScript 1.6 和 JavaScript 1.7 中的所有新特性。
参见 bug 380236 以跟踪 JavaScript 1.8 的开发进度。本文档的状态见于 bug 421027 。
使用 JavaScript 1.8
为了可以在 HTML 中使用 JavaScript 1.8 的新特性,需要这样写:
<script type="application/javascript;version=1.8"> ... 你的代码 ... </script>
在使用 JavaScript shell 、JavaScript XPCOM 组件,或者 XUL <script>
元素的时候,自动启用最新的JS版本(Mozilla 1.9中的 JS1.8)( bug 381031 , bug 385159 )。
另一种方法(不推荐)是使用旧式的 <script> 属性 language,把它定义为 "JavaScript1.8"。
如果需要使用新的关键字 "yield" 和 "let",你需要指定是1.7版本或者更高的版本,因为现有的代码可能会把这两个关键字用作变量名或者函数名。如果没有使用任何新的关键字,就可以不指定 JavaScript 的版本。
表达式闭包
这个新添加的特性其实就是简单函数的方便写法,使得这个语言更加类似典型的Lambda notation .
JavaScript 1.7 以及更老的版本:
function(x) { return x * x; }
JavaScript 1.8:
function(x) x * x
这个语法允许你省略花括号和 'return' 语句--使它们成为隐式的。用这种方法写,只是表面上看起来短了一些,并没有其他好处。
示例:
绑定事件处理器的简单写法:
document.addEventListener("click", function() false, true);
把这个定义与 JavaScript 1.6 中的数组函数一起使用:
elems.some(function(elem) elem.type == "text");
生成器表达式
这个新添加的特性,允许你简单的创建生成器(在 JavaScript 1.7 中引入)。通常你需要创建一个自定义的函数,它含有一个 yield,但这个新特性使你可以使用类似数组领悟 的语法来创建一个独立的生成器句柄。
在 JavaScript 1.7 中,你可能需要写出像下面这样的代码来为一个对象创建自定义的生成器:
function add3(obj) {
for ( let i in obj )
yield i + 3;
}
let it = add3(someObj);
try {
while (true) {
document.write(it.next() + "<br>/n");
}
} catch (err if err instanceof StopIteration) {
document.write("End of record.<br>/n");
}
在 JavaScript 1.8 中,你可以规避要创建生成器函数的麻烦,而使用一个生成器表达式来代替:
let it = (i + 3 for (i in someObj));
try {
while (true) {
document.write(it.next() + "<br>/n");
}
} catch (err if err instanceof StopIteration) {
document.write("End of record.<br>/n");
}
生成器表达式也可以被作为值传给一个函数。特别要注意的是,生成器在绝对要用到的时候才运行(与典型的数组领悟的场景不同,不事先构造数组)。这个区别可以从下面的例子中看出:
使用 JavaScript 1.7 数组领悟
handleResults([ i for ( i in obj ) if ( i > 3 ) ]);
function handleResults( results ) {
for ( let i in results )
// ...
}
使用 JavaScript 1.8 的生成器表达式
handleResults( i for ( i in obj ) if ( i > 3 ) );
function handleResults( results ) {
for ( let i in results )
// ...
}
这两个例子之间最大的区别就是,使用生成器表达式的时候,一共只循环 'obj' 结构一次;而在第一个例子中,领悟这个数组时要循环一次,遍例的时候又循环一次。
更多数组特性
JavaScript 1.8 中包含了两个新的数组遍例方法,分别是:
- reduce() - 对该数组的每项和前一次调用的结果运行一个函数,收集最后的结果。
- reduceRight() - 同上,但从右向左执行。
Changes in destructuring for..in
TBD: mention New_in_JavaScript_1.7#Looping_across_objects ( bug 366941 ).
Upcoming changes
Changes expected to arrive in JavaScript 1.8 include:
- JSON encoding and decoding.
- Slice syntax.
- Generalized destructuring
for...in
(does this mean something other than #Changes in destructuring for..in ? --Nickolay 10:52, 9 September 2007 (PDT))