javascript < 人生が二度あれば

JavaScriptでArrayのようなObjectをArrayとしてあつかう

JavaScriptではArrayのようなObjectはArrayのメソッドを利用することやArrayに変換することが可能です。ArrayのようなObjectというのは添字に数字をつかっていて、lengthという内容の数を示すプロパティーがあるObjectのことを指します。たとえばStringやDOMのNodeListなどが当てはまります。

Array.prototype.map.call('STRING', function(str) {
  return str + str.toLowerCase();
}).join('');

といった形でつかうことができます。またsliceメソッドをもちいてArray.prototype.slice.call(str)とすることにより任意のObjectをArrayに変換することが可能になります。

function toArray(obj) {
  return Array.prototype.slice.call(obj);
}

といった函数を用意しておけばさまざまな用途につかうことが可能になるので便利なのではないでしょうか。

たとえばdocument.getElementsByTagNameで取得することができるNodeListは動的なものなりますので、for文を用いてループをさせると多少遅くなってしまいます。なのでtoArray(document.getElementsByTagName('a'))のようにあらかじめしておけば、速度も速くなりますし、またforEachmapといった配列を操作するのに便利なメソッドをつかうことが可能になり、コード全体の見通しも比較的 良くなるのではないでしょうか。

JavaScriptは変数名などに非ascii文字がつかえる。

一見できないとおもわれがちではあるのですが、JavaScriptは変数や函数の名前に日本語などの非asciiな文字をつかうことが可能です。ただ入力時にIMの切りかえをおこなわなければならず、またコードの見通しもあまりよろしくなくなるので積極的につかいたいとおもえるようなものではありませんが、知っていても損はないことかとおもいます。

糖衣構文はなるべく避けてコードを書いている

わたしがコードを書くときには、よほどのことがない限りは糖衣構文 (シンタックスシュガー) はなるべく避けるように書いています。書きやすさや短さよりも、ひとめ見るだけでどう動くのかがわかりやすくなっているコードのほうが良いとわたしはかんがえています。なので、たとえばJavaScriptのGlobalObject['ObjectName']['methodName']()ObjectName.methodName()のように、糖衣構文のほうがわかりやすい場合は糖衣構文をつかうようにしています。

わたしがCoffeeScriptをつかわない理由

クラス (のような物) を実装したい時に

class TestServer extends Server
  constructor: (options) ->
    super()
    @hostname = options.hostname or 'localhost'
    @port = options.port or 80

  run ->
    @listen @port, @hostname

と書くのと

function TestServer(options) {
  Server.call(this);
  this.hostname = options.hostname || 'localhost';
  this.port = options.port || 80;
}
TestServer.prototype = Object.create(Server.prototype);

TestServer.prototype.run = function() {
  this.listen(this.port, this.hostname);
};

と書くのにみじかく書けるということ以外に明確な差があるとわたしはおもえないので、新たに学習してまでCoffeeScriptをあえてつかう理由はないとかんがえています。