== はやればできる子(でも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 ... }