io.js第一个版本正式发布, 将默认支持JavaScript 的 ES6 标准,并不需要 --harmony 标签 (注* 在NodeJS中启用ECMAScript 6 )
下面的这些ES6特性将不需要任何标签就可直接使用:
那么这些功能都能干什么,具体怎么用?看看示例代码就可一目了然。部分示例来自 MDN
let, const 声明的变量,将只能在块级 {} 作用域中使用和访问。
新的集合类型,WeakMap, WeakSet 是一种弱引用类型,因此WeakMap键值不能枚举(即有没有办法给你key的列表)。这样做的好处是有利于垃圾回收。如果你想有键列表,你应该自己维护。
主要看Map和Set,
Map 类似于 HashMap, 与Object {}不同,可用各种类型的变量作为key
Set 类似于索引,Redis 一般用这种数据类型来做索引和查询 参见: 在nodejs使用Redis
二进制和八进制语法
十进制
二进制 0b开头代表二进制
Generators*声明(function关键字后跟一个星号)定义了一个 generator 功能。
generator可以先退出一个函数,然后重新调用next()时重新进入该function。它们的上下文(变量)将在重进入前被保存。
这样就形成一个函数链,避免回调嵌套, koa web server框架使用了这种机制
Promise 对象用于延迟和异步计算。可有效避免JavaScript回调函数的深层嵌套,原本是一种设计模式,ES6将这种模式内置其中,一般Promise会有三种状态:
待定:初始状态,没有履行或拒绝。
完成:操作成功
拒绝:操作失败。
模板字符串允许在字符串中嵌入的表达式。
前两天Chrome刚支持 字符串模板 ,iojs 就加进去了
String 添加了更多的的新函数,参见MDN
String.fromCodePoint()
String.prototype.codePointAt()
String.prototype.startsWith()
String.prototype.endsWith()
String.prototype.contains()
String.prototype.repeat()
String.prototype.normalize()
String.raw()
Symbol(符号)是一个独特的和不可改变的数据类型,并且可以被用作标识符对象属性。Symbol对象的Object key值属性对外是隐藏的。
如下例 "a" 只能通过 key 来访问,可以实现类似 private 访问控制符的效果
下面的这些ES6特性将不需要任何标签就可直接使用:
- Block scoping (let, const)
- Collections (Map, WeakMap, Set, WeakSet)
- Generators
- Binary and Octal literals
- Promises
- New String methods
- Symbols
- Template strings
那么这些功能都能干什么,具体怎么用?看看示例代码就可一目了然。部分示例来自 MDN
Block scoping (let, const)
let, const 声明的变量,将只能在块级 {} 作用域中使用和访问。
(function() {
//let 需要在 strict模式下才能使用
'use strict'
var a = 1
{
var b = a + 1
let c = a + b
}
console.log(a, b, typeof c)
})()
//$>1 2 'undefined'
Collections (Map, WeakMap, Set, WeakSet)
新的集合类型,WeakMap, WeakSet 是一种弱引用类型,因此WeakMap键值不能枚举(即有没有办法给你key的列表)。这样做的好处是有利于垃圾回收。如果你想有键列表,你应该自己维护。
主要看Map和Set,
Map 类似于 HashMap, 与Object {}不同,可用各种类型的变量作为key
var myMap = new Map();
var keyFunc = function () {};
// 设置值
myMap.set(keyFunc, "Function Key");
console.log(
myMap.get(keyFunc)
)
//$> Function Key
Set 类似于索引,Redis 一般用这种数据类型来做索引和查询 参见: 在nodejs使用Redis
var mySet = new Set();
mySet.add(1);
mySet.has(1); // true
mySet.delete(1); // 从set中移除
mySet.has(1); // false
Binary and Octal literals
二进制和八进制语法
十进制
var o = 1234567890
//使用0前辍时注意:
var a = 0888 //888解析为十进制 (比7大)
var b = 0777 //解析为八进制, 511
二进制 0b开头代表二进制
var FLT_SIGNBIT = 0b10000000000000000000000000000000; // 2147483648
Generators
Generators*声明(function关键字后跟一个星号)定义了一个 generator 功能。
generator可以先退出一个函数,然后重新调用next()时重新进入该function。它们的上下文(变量)将在重进入前被保存。
这样就形成一个函数链,避免回调嵌套, koa web server框架使用了这种机制
function* idMaker(){
var index = 0;
while(true)
yield index++;
}
var gen = idMaker();
console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
Promise
Promise 对象用于延迟和异步计算。可有效避免JavaScript回调函数的深层嵌套,原本是一种设计模式,ES6将这种模式内置其中,一般Promise会有三种状态:
待定:初始状态,没有履行或拒绝。
完成:操作成功
拒绝:操作失败。
var jsonPromise = new Promise(function(resolve, reject) {
//解析错误,由catch捕获
resolve(JSON.parse("This ain't JSON"));
});
jsonPromise.then(function(data) {
console.log("It worked!", data);
}).catch(function(err) {
console.log("It failed!", err);
});
//$> It failed! [Syntax Error: Unexpected tocken T]
Template strings
模板字符串允许在字符串中嵌入的表达式。
前两天Chrome刚支持 字符串模板 ,iojs 就加进去了
var a = 5;
var b = 10;
console.log(`Fifteen is ${a + b} and\nnot ${2 * a + b}.`);
//$> "Fifteen is 15 and
//$> not 20."
New String methods
String 添加了更多的的新函数,参见MDN
String.fromCodePoint()
String.prototype.codePointAt()
String.prototype.startsWith()
String.prototype.endsWith()
String.prototype.contains()
String.prototype.repeat()
String.prototype.normalize()
String.raw()
Symbol
Symbol(符号)是一个独特的和不可改变的数据类型,并且可以被用作标识符对象属性。Symbol对象的Object key值属性对外是隐藏的。
如下例 "a" 只能通过 key 来访问,可以实现类似 private 访问控制符的效果
var obj = {};
var key = Symbol("a");
obj[key] = "a";
obj["b"] = "b";
for (var i in obj) {
console.log(i);
}
//$> b
Python不可维护? 终于把一个8万行的Python程序用Javascript重写了