偏見？参考にならないjQueryのページの見分け方

# 最初に

[独断！参考にならないJavaScriptページの見分け方](http://qiita.com/goakafu/items/d75c73612e00885167bf)
こちらの記事が秀逸だったので、触発されてjQueryに寄った記事を書いてみようと思います。

## 動機

jQueryも随分と広く使われるようになり、『JavaScript使えます』って意味合いの中にjQueryしか使えないってのも含まれてしまうようになったりするのも若干なんだかなぁとは思いますが、  
それはさておき、「チームメンバーになんでこんな書き方してんの？」って聞いたらそういう書き方をしているページが検索で出てきたりして…そういう苦い思い出を思い返しながら、この記事を書こうと思います。

## この記事の対象者

* コピペで動けば良いやという人**以外**
* コピペより先にまだ進めていない人

## この記事を書いてる人のスペック

* PHPというかLaravelが好き
* JavaScript始めたのはprototype.jsの頃
* ES6まだよくわかってないですごめんなさい

## コメント編集リクエスト歓迎します

基本的に低次元な話ばかりになると思いますが…場末の現場レベルではこのレベルで言わなきゃ伝わらないことがあるので、そういう視点で読んでいただけるとありがたいです。

# Fatal（そっ閉じ推奨レベル）

## `<a onclick="hoge();">`<br>`<body onload="init();">`

なんでjQuery使ってるのって感じです…。
なぜjQueryが1.0から[addEventListener](https://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener)をラップしてきたのか、先人の苦労は一体…。
とりあえず、閉じてOKです。

### どうすればよいか

`$(selector).on('click', function(){})`を使ったり、
`$(function() {});`を使いましょう。
`onclick=""`などは使うことで起こる問題は山盛りありますが、きちんとjQueryを使うことで**したいことは実現できます。**[^4]

## グローバル空間での`function hoge(){}`

なぜグローバル空間に書くのかというと、だいたい、onclick="hoge()"と書きたいからなんじゃないかなーという印象。

なお、サンプルコードは除きます。
`<script>`タグの中に、`$(function(){});`で囲っている領域があるにも関わらず、`<script>`直下に`function hoge(){}`とか書いていたら要注意です。

### どうすればよいか

```javascript
(function() {
    function hoge () {
        //
    };
})();
```

ちゃんとスコープ分けましょう。
グローバルに使いたいコードならば、名前空間に押し込みましょう。

参考： [【脱初心者JavaScript】名前空間のイロハ](http://qiita.com/kenju/items/0d8f85df205ea4978508)

# Warn（8割疑うレベル）

## `$(document).ready(function() {});`

これ自体、お決まりのコードみたいなもので調べたいものの本編とは異なる事があるので一概に悪とは言えませんが…少なくとも、jQueryではわりと前から、`$(function(){});`への置き換えが推奨されていましたし、deprecatedになっているのでいつ削除されてもおかしくありません。

最近の記事でこの記述を見た場合、高確率でコピペである可能性があります。

参考： [.ready() | jQuery API Documentation](https://api.jquery.com/ready/)

### どうすればよいか

`$(function())`を使いましょう。

```javascript
$(function() {
    //
});
```

## `new Array();` `new Object()`;

大抵使う意味ないです。問題も起こります。

参考： [JavaScriptの配列の生成方法の違い 〜リテラル `[]` とコンストラクタ `new Array()` 〜](http://qiita.com/macoril/items/1366c7d6e5bf1347e91b)

少なくとも、書いた人が[JavaScript: The Good Parts](https://www.amazon.co.jp/gp/product/4873113911/)を読んでいないことはわかります。

### どうすればよいか

```javascript
var ary = [];
var obj = {};
```

リテラルで作成しましょう。
**とりあえず機械的にこっち使ってれば問題ないです。**

## `.bind();` `.unbind();` `.live();`

これらも3.0からdeprecatedです。

https://api.jquery.com/category/deprecated/deprecated-3.0/

### どうすればよいか

`.on()` `.off()`を使いましょう。
`.live()`も置き換え可能です。

`.on()`については、第二引数を含めるかどうかで意味合いが大きく変わりますが、
jQueryにおけるイベントのバインドは全て`.on()`に任せることができるようになります。

参考： [jQuery 便利なonを使おう（on click)](http://qiita.com/shizuma/items/d561f37f864c3ebb5096)

## `.attr('checked', true);`　

属性値を持たない`checked`などの属性の取得や設定に`attr()`を使った場合、うまく動作しません。
昔はできた時代もあったので…これが書かれているページは古いか、コピペかのどっちかです。

### どうすればよいか

属性値を持たない`checked`や`disabled`の操作には`prop()`を使いましょう。
属性値を持つ属性に対してのみ`.attr()`を使用します。

また、`value` `class` `style`は、それぞれ専用のメソッドがあるので、`.attr()`を使ってはいけません。
それぞれ`value`は`.val()`、`style`は`.css()`、
`class`に関しては`.hasClass()` `.addClass()` `.removeClass()`を使い分けましょう。

参考： [jQueryにおけるattrとpropの違いと使いドコロまとめ](http://qiita.com/kbyay_/items/7a7ce9547f29b34a63b1)

### 補足

`data`属性に関しては、`.attr('data-foo')`と`.data('foo')`を場合によって使い分ける必要があります。

参考： [jqueryのattrとprop（とdataとvalとhtmlとかつまり属性とかの取得）の使い分け一覧](http://qiita.com/smzk/items/8adac00010e48cc7bd84)

大雑把に言って、`.data('foo', 'value')`で設定した値は`.data('foo')`でしか取得できませんし、
`.attr('data-foo', 'value')`で設定した値は、`.attr('data-foo')`でしか取得できません。

とりあえずは、`data`の扱いは状況によって二種類あると覚えておけばいつか役立つかもしれません。

## `.attr('class') === 'foo'`

classが設定されているか確認するのに、`.attr('class')`を使うのは適切ではありません。
この形で比較した場合、対象の要素に複数のclassが設定されていた場合にうまく動作しません。[^3]

### どうすればよいか

`.hasClass()`を使って確認しましょう。
他、classの追加や削除も`.attr('class')`は決して使わずに、`.addClass()` `.removeClass()`等の専用のメソッドを使いましょう。

```javascript
if ($('#elem').attr('class') === 'foo') {
    //BAD
}

if ($('#elem').hasClass('foo')) {
    //GOOD
}
```

# Notice（十分に気をつけたほうがいいレベル）

## `$.ajax({success::function(){}, error: function(){});`

**既に古い書き方になっています。**

参考: [おじさんが若い時はね$.ajax()のオプションでsuccessとかerrorとか指定していたんだよ（追憶）](http://qiita.com/tonkotsuboy_com/items/0722ad92f370ab0c411b)

###　どうすればよいか

コメントも含め、上記のページを参考にすると良いでしょう。

```javascript
$.ajax({
    url: "http://example.com/"
})
.then(
    function (data) {
        //success:の置き換え
    },
    function () {
        //error:の置き換え
    }
);
```

## `.click()`等

これもとっくにdeprecatedになっているものと思っていたのですが、まだ使えるみたいですね。
個人的には、on()に置き換えたほうが良いと考えています。
on()だと名前空間も使えますしね。

参考： [jQuery.fn.onに名前空間をつけることができる](http://qiita.com/yuku_t/items/89044987d45ec58ea7c5)

## jQueryじゃなくてjquery, Jqueryとか書いてある

元ネタの方には`JavaScript`の綴りについて記載がありましたが…、
もちろん、typoの可能性もありますが、正しくは`jQuery`です。大文字小文字大切。

## プロフィールに本業がデザイナー的なことが書いてある

急に毛色が変わりますが…経験則として。

プロフィールに本業がデザイナーと言うようなことを書いているページに記載されているjQuery(とJavaScript)は間違っていることが非常に多いです。
だいたいは単にコピペして拾ってきた結果でしかありません。[^1][^2]

### どうすればよいか？

あなたがエンジニアだと自負していたり目指しているなら、そのまま書いている内容をコピペしないこと。
書いている内容が動いたとして、その意味をわかってから使うこと。
理解すればコピペにはなりません。

## その他

ページの見分け方ではないですが、何かしらの既存のソースを読んだ時のレベルをお察しする基準としては、この記事に書いたものの他に以下のようなものがあります。

* `'use strict';`を書いていない
* jQueryでメソッドチェインを使っていない  
  （`$("#hoge")`で始まる行がたくさん続いている等）
* 全ての比較演算子が`===`じゃなくて`==`を使ってる
* HTMLの中にやたらJavaScriptを書いている

~~参考： [JR東日本アプリが重すぎるので解析ようとした件](http://qiita.com/sansaisoba/items/86f9832b110d0b70a73d) に貼っているURLのjsとかhtmlとか~~

# 迷わないために

## 困ったときはMDN

https://developer.mozilla.org/ja/docs/Web/JavaScript

JavaScript本体で困ったときは、MDNを読むのが確実です。
他の日本語文献で引っかかった情報も、必ずMDNで裏付けを取るべきです。
これだけで下手な情報に惑わずに済みますし、MDNにはバージョンもちゃんと書いています。

## jQuery API Documentationを読む

http://api.jquery.com/

上記に同じく、jQueryについてもできるだけ公式リファレンスで裏付けを取るべきです。
[semooh](http://semooh.jp/jquery/)は読みやすいし、謎の生物は可愛いし良かったんですけどね…情報がそろそろ古すぎて。

## [JavaScript: The Good Parts](https://www.amazon.co.jp/gp/product/4873113911/)を読む

元記事でも言及されていますが、そんなに高くない本だし内容も読みやすいので、JavaScriptを書くことがあるのなら一読しておくべきです。

---

[^1]: 本業デザイナの方の気に障ったらすみません…。実際、私よりコードの書けるデザイナさんにも出会ったことはあるので全てがそうだとは思いませんが、何にせよ「エンジニアなら安易にコピペすんな」が言いたいことです。
[^2]: ついでに「デザイナはコードを公開するな」でも無いですよ、念のため。良いかどうかは主観ですので、誰かの役に立つ可能性を捨てるのは勿体無いです。
[^3]: ちなみに、要素に複数のクラスが設定されていることを考慮して、`.attr('class')`で取得した値に更に正規表現で確かめているコードを見たことがあります…なぜそこをがんばった。
[^4]: 『onclick使わないとできないです』って言われたことがあるんだけど、そんなことない