Hatena::ブログ(Diary)

latest log このページをアンテナに追加 RSSフィード

2009-12-23

== はやればできる子(でも95%のシーンではいらない子)

var ary1 = [1, 2];
var ary2 = [1, 2];

プリミティブな値(文字列とか数値)だけが格納されている2つの配列(ary1 と ary2)の内容が、同じかどうかを確認したい場合に…

function like(ary1, ary2) {
  if (ary1.length !== ary2.length) {
    return false;
  }
  var v, i = 0, iz = ary1.length;

  for (; i < iz; ++i) {
    if (ary1[i] !== ary2[i]) {
      return false;
    }
  }
  return true;
}
alert(like(ary1, ary2)); // true

とか書いてませんか?

もっと短く…

alert(ary1.join(",") === ary2.join(",")); // true

もっともっと短く + 速く

alert(ary1 + "" == ary2); // true

最後のコードは、== オペレータの効能と、Array.prototype.toString() の特性を利用したもので、

  • Array.prototype.toString() は array.join(",") を呼ぶ
  • ary1 + "" → ary1.toString() → ary1.join(",") → "1,2" に変形される
  • "1,2" == [1,2] は "1,2" === "文字列" の形に変換してから比較されるので
    • ary2.toString() → ary2.join(",") → "1,2" が行われる

つまり、ary1 + "" == ary2 は、 "1,2" === "1,2" と同じ結果になります。

JavaScript The Good Parts では「== は邪悪なパーツ」

Good Parts は JavaScript プログラマ Lv0〜3 向けの内容(初心者++ 向け)らしく、速度に関する考察が全体的に欠落しています。

Good Parts では、「== は副作用があり邪悪なパーツ」と紹介されていますが、速度と短さ(≒簡潔さ)が求められるシーンでは、「== を選択する合理的な理由が存在する」ということを知っていると、ハッピーになれるかもしれません。

Good Parts を購入して「あまり見るべきところがなかった」ともらす方々は、すでに Lv6 以上の実力の持ち主かもしれませんね。

# 勘違いしちゃだめだよ、ここは「志村 Good Parts 買うなよ? 絶対買うなよ?」メソッドだからね

uupaa.js 0.7 では

== が 15 箇所あり、=== が 310箇所ほどありました。約5% のケースで == の効能を生かした実装を行っています。

== を意図的に利用している場合は

コードの原型を ↓ コメントで残すとか

if (ary1 + "" == ary2) { // ary1.join(",") === ary2.join(",")
  ...
}

function hoge(arg) {
  if (arg == null) { // arg === null || arg === undefined
    ...
  }
}

function huga(mix) { // @param String/Number:
  if (mix == 1) { // mix === "1" || mix === 1 
    ...
  }
}

説明が面倒なら、このページに ↓ リンクを張ってもOKだと思います

if (ary1 + "" == ary2) { // http://d.hatena.ne.jp/uupaa/20091223
  ...
}

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト

コメントを書くには、なぞなぞ認証に回答する必要があります。

トラックバック - http://d.hatena.ne.jp/uupaa/20091223/1261505831