Google JavaScript Style Guide
ファイル名
- すべて小文字、拡張子は「.js」、区切り文字はアンダースコア。
命名
- functionNamesLikeThis
- variableNamesLikeThis
- ClassNamesLikeThis
- EnumNamesLikeThis
- methodNamesLikeThis
- SYMBOLIC_CONSTANTS_LIKE_THIS
命名その他
- Privateのプロパティ、変数、メソッドには、末尾にアンダースコア(Protectedの場合はアンダースコアなし)。
- オプション引数には、先頭に「opt_」。
- getter→「getFoo()」、setter→「setFoo(value)」(booleanのgetterの場合「isFoo()」の可)。
{}
処理系によってセミコロンが暗黙で挿入されるのを防ぐために、開きカッコの前で改行しない。
if () { // ... } else { // ... }
整列
プロパティを整列させると問題を引き起こす場合があるので、整列はさせない。
以下はNG。
WRONG_Object.prototype = { a : 0, b : 1, lengthyName: 2 };
2項/3項演算子
暗黙のセミコロンの問題の発生をさけるため、改行を入れる場合は、演算子は先行する行へ。
var z = a ? moreComplicatedB : moreComplicatedC;
クオート
ダブルクオートよりシングルクオート(HTMLな文字列を扱うときに便利)。
var msg = 'なんらかの HTML';
コメント
JSDocを使用。
→jsdoc-toolkit - A documentation generator for JavaScript. - Google Project Hosting
トップレベル/ファイルレベルコメント
// Copyright 2009 Google Inc. All Rights Reserved. /** * @fileoverview ファイルの説明, 使用方法や * 依存関係の情報など. * @author user@google.com (Firstname Lastname) */
クラスコメント
/** * なんだか楽しいクラス. * @param {string} arg1 An argument that makes this more interesting. * @param {Array.<number>} arg2 List of numbers to be processed. * @constructor * @extends {goog.Disposable} */ project.MyClass = function(arg1, arg2) { // ... }; goog.inherits(project.MyClass, goog.Disposable);
メソッド/関数コメント
/** * テキストをなにか全く別のテキストに変換する * @param {string} arg1 An argument that makes this more interesting. * @return {string} Some return value. */ project.MyClass.prototype.someMethod = function(arg1) { // ... }; /** * MyClass のインスタンスを処理して何かを返す関数 * @param {project.MyClass} obj Instance of MyClass which leads to a long * comment that needs to be wrapped to two lines. * @return {boolean} Whether something occured. */ function PR_someMethod(obj) { // ... }
プロパティコメント
/** * 1 pane ごとの最大数. * @type {number} */ project.MyClass.prototype.someProperty = 4;
基本
真偽値
以下はfalse
null undefined '' //からの文字列 0 //数値
以下はtrue
'0' //文字列 [] //空の配列 {} //空のオブジェクト
演算子
== > < != && ||
i > 0 ? x = "正" : x = "負"
if
if(){ }else if(){ }else{ }
ループ
//0から9まで for(i = 0; i < 10; i ++){ } //配列 for(rec in myList){ } //ループから抜ける break; //続ける continue;
while(i > 10){ }
ノードリストのループの場合、
//以下よりも、 var paragraphs = document.getElementsByTagName('p'); for (var i = 0; i < paragraphs.length; i++) { doSomething(paragraphs[i]); } //以下の方がベター var paragraphs = document.getElementsByTagName('p'); for (var i = 0, paragraph; paragraph = paragraphs[i]; i++) { doSomething(paragraph); } //childNodesをたどる場合は、firstChildやnextSiblingプロパティを使う var parentNode = document.getElementById('foo'); for (var child = parentNode.firstChild; child; child = child.nextSibling) { doSomething(child); }
関数/サブルーチン
//function文 funtion test(aa,bb){ return true; } //関数リテラル var test = function (para) { return true; } //Functionコンストラクタ関数 var test = new Function(para1, para2, ..., 処理);
変数宣言
//varでの宣言はブロック内ではなく、関数全体でローカル(varを省略するとグローバル) var i; var test1, test2; var message = "Hello"; var i= 0, j = 1, k = 5; var b = a; var list = [1, 2, 3]; var a = {x:1, y;3} var list = [[1, 2], [10, 20], {x:1, y:3}];
数値
//足す引く var num = 5; num ++; num --; //数値にする(10進数へ)('130px'→130) parseInt(_str, 10); //切り捨て(1.3→1 2.5→2) Math.floor(num) //切り上げ(1.3→2 2.5→3) Math.ceil(num) //ランダム(0より大きく1より小さい小数を返す) Math.random()
文字
//つなげる var str = "あいう"; str += "えお"; //2文字目 str.charAt(1) //4〜8文字 str.slice(3, 7); str.substring(3, 7);
配列
//配列 var myList = new Array(); var myList = new Array(1,4,9); myList[0] = 1; myList[0] = 5; myList[0] = 9; //2次元配列(それぞれに配列宣言が必要) var myList[0] = new Array(); myList[0][1] = 23; //長さ(要素数) myList.length //split(new Array()は必要ない) myList = myText.split("/"); //join str = myList.join("x"); //reverse myList.reverse //sort myList.sort //push/pop/shift/unshift/slice myList.push('aaa');
配列への追加は、pushよりインデックス指定の方が高速。
var html = []; for (var i; i < items.length; i ++) { html[i] = itemHtml(items[i]); }
連想配列
price["apple"] = 100; price["banana"] = 150;
typeof
if(typeof _str == "string") //文字列型 "string" //数値型 "number" //論理値型 "bookean" //関数型 "function" //未定義 "undefined" //オブジェクト型 "object"
デバッグ
alert(); window.status();
マッチング
_str.match(/abc/); _str.replace(/abc/, '123'); _str.replace( /(\\d+?)\\-(\\d+?)/, function(_match, _one, _two){ var newId = parseInt(_one) + 1; return newId + '-' + _two; } );
フォーム
//何もしない <a href="javascript:void()">クリック</a>
プロンプト
//OKで入力文字列、キャンセルでnull、無入力で'' n = prompt('入力してください', 'デフォルト');
if( confirm('よろしいですか') ){ OKクリックの処理 }else{ キャンセルクリックの処理 }
alert('違います')
タイマー
//5000ミリ秒後にxxxx()を実行(1秒=1000ミリ秒) timerid = setTimeout("xxxx()", 5000); //クリア clearTimeout(timerId);
イメージオブジェクト
var img = new Image(280, 140); //イメージのロード img.src = 'officek.jpg';
オブジェクト
//コンストラクタ function Person(_age, _sex) { this.age = _age; this.sex = _sex; //オブジェクトを返す return this; } //クラスの作成 var yugo = new Person(31, 'male'); //プロパティの追加(宣言なしで追加可能) yugo.eyeColor = 'black'; //連想配列の引数はすべてプロパティ yugo['eyeColor'] = 'black';
function changeAge(_age) { this.age = _age; } var yugo = new Person(31, 'male'); //メソッドの追加 yugo.chgAge = changeAge; yugo.chgAge(100);
PersonクラスオブジェクトのPersonコンストラクタをnew演算子を用いて起動。
newは、メモリ上に場所を確保し、そのポインタを返す演算子。
yugoがPersonオブジェクトのインスタンス。
予約済みプロパティ
//そのオブジェクトを作成したコンストラクタ constructor //引数 arguments //要素数 length
イベントハンドラ
//ロード onLoad //アンロード onUnload //フォーカス onFocus //フォーカスを外れた onBlur //変更された onChange //選択された onSelect //マウスボタン(onMouseDown→onMouseUp→onClick) onMouseDown onMouseUp onClick onDblClick onmouseover onmouseout onmousemove //down→up→press onkeydown onkeyup onkeypress onmove onresize onReset onSubmit
document.getElementById("id")
obj.style.color = "#ff0000";
あれこれ
//select選択された項目のインデックス(0始まり) document.form1.select1.selectedIndex this.selectedIndex
//1秒後に実行 setTimeout(alert('hey!'), 1000);
オンラインツール
- Javascript keyCode checker tool(キーコード表示)
http://www.ryancooper.com/resources/keycode.asp