io.js新支持的ECMAScript 6功能特性详解


发布者 kris  发布时间 1421379581274
关键字 技术前沿  开源 
io.js第一个版本正式发布, 将默认支持JavaScript 的 ES6 标准,并不需要 --harmony 标签  (注* 在NodeJS中启用ECMAScript 6

下面的这些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






回复 (1)
  • #
  • #1 孟多比 1429199942794

    Python不可维护? 终于把一个8万行的Python程序用Javascript重写了

微信扫码 立即评论