なっく日報

技術やら生活やらのメモ

Node.js v4がリリースされたらコードの書き方でどこが変わるか?

追記1続・Node.js v4がリリースされたらコードの書き方でどこが変わるか? - なっく日報に続きを書きました。
追記2Computed propetiesにバグがあることを追記しました。
追記3Computed propetiesのバグが修正されたので該当箇所を削除しました。

9月には出るということで、ちょっと考えてみました。

iojs v3のES6でshipping featuresなもの(V8においてES6でONにしても大丈夫な機能)で書いてますが、もし違ったらすいません。

iojs.org

変数宣言

基本letconstvarは使わない。

'use strict'; // strictモードでないとletとconstは使えない

const STATIC_VAR = '定数';
let a = 'varは使わない';

for (let i = 0; i < 10; i++) {
  //
}

が、ここで全部constでいいんじゃないかまた迷いが。

ES6では変数の宣言にletとconstどっちを使うべきか? - なっく日報

var, const, letで百万回ループを回してもそこまで差は出なかったので大丈夫じゃないかとは思いつつ迷う。。

超適当なベンチマーク

console.time('var');
for (let i = 0; i < TIMES; i++) {
  let aaa = i + v + v;
  console.error(aaa);;
}
console.timeEnd('var');

console.time('const');
for (let i = 0; i < TIMES; i++) {
  let aaa = i + c + c;
  console.error(aaa);;
}
console.timeEnd('const');

console.time('let');
for (let i = 0; i < TIMES; i++) {
  let aaa = i + l + l;
  console.error(aaa);;
}
console.timeEnd('let');

クラス

普通にclassを使う。

prototype__proto__を見かけることはほぼなくなる気がする。

class Cat {
  constructor(name) {
    this._name = name;
  }

  get name() {
    return this._name;
  }

  set name(name) {
    this._name = name;
  }

  speak() {
    console.log(this.name + ' makes a noise.');
  }

  static nyang() {
    console.log('nyang');
  }
}

オブジェクトリテラル

Enhanced Object Literalsの機能をちゃんと使う。

var a = 'abc';

var obj = {
  a,
  hoge() {
  },
  [a]: 'abcがプロパティ名', 
};

文字列

変数混在の文字列、複数行の文字列にはTemplate stringsを使う。

let a =  'Template strings';
let b = `${a}を基本的には使う。`;
let c = `複数行の場合も
Template strings
`;

文字列のメソッド

今までなかったメソッドが追加されています。便利。

'-'.repeat(10);
'abc'.includes('b');
'abc'.startsWith('a');
'abc'.endsWith('c');

for-of

これは積極的に使って良いと思います。・・・が、念のためベンチマークをとってみました。

'use strict';

const TIMES = 1000000;

let array = [];

for (let i = 0; i < TIMES; i++) {
  array.push(i);
}

console.time('normal');
for (let i = 0; i < TIMES; i++) {
  console.error(array[i]);
}
console.timeEnd('normal');

console.time('for-of');
for (let i of array) {
  console.error(i);
}
console.timeEnd('for-of');
iojs for.js 2> /dev/null
normal: 2704ms
for-of: 2869ms

ま、大丈夫そう。

PromiseやGenerators

使うべき場面があれば、使うという感じでしょうか。。特にGeneratorsの方は正直あまり使う場面が思い浮かびません。

Map, Set, WeakMap, WeakSet

使っていきましょう。

Symbols

すいません、どこで使えばよいのでしょうか・・・(すいません)

おまけLint

これを機にJSHintを使っている場合はESLintに乗り換えて良いんじゃないでしょうか。

ES6関連のESLintの設定は本家の.eslintrcが参考になりますね!
https://github.com/nodejs/node/blob/master/.eslintrc#L5