Skip to content

Commit e003be3

Browse files
committed
Merge remote-tracking branch 'ja-translation/ja'
Conflicts: doc/language.json
2 parents a6cdc5e + 22b5551 commit e003be3

25 files changed

+1576
-4
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@
1010
/site/fi
1111
/site/pl
1212
/site/tr
13+
/site/ja
1314
*.md~
1415
*.src.md

build.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
var fs = require('fs'),
2-
path = require('path');
2+
path = require('path'),
33
jade = require('jade'),
44
md = require('node-markdown'),
55
Class = require('neko').Class;
@@ -28,10 +28,10 @@ var Garden = Class(function(options) {
2828

2929
if (that.loadIndex()) {
3030
that.languages[lang] = that.lang;
31-
that.log(' Done.')
31+
that.log(' Done.');
3232

3333
} else {
34-
that.log(' Error: Could not find "index.json"!')
34+
that.log(' Error: Could not find "index.json"!');
3535
}
3636
}
3737
});

doc/ja/array/constructor.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
## `Array`コンストラクター
2+
3+
`Array`コンストラクターはそのパラメーターの扱い方が曖昧なので、新しい配列を作る時には、常に配列リテラル - `[]`記法 - を使用する事を強くお勧めします。
4+
5+
[1, 2, 3]; // 結果: [1, 2, 3]
6+
new Array(1, 2, 3); // 結果: [1, 2, 3]
7+
8+
[3]; // Result: [3]
9+
new Array(3); // 結果: []
10+
new Array('3') // 結果: ['3']
11+
12+
このケースの場合、`Array`コンストラクターに渡される引数は一つだけですが、その引数は`Number`になります。コンストラクターは、引数に値がセットされた`length`プロパティを伴った新しい**配列を返します。特筆すべきなのは、新しい配列の`length`プロパティ**のみ**が、このようにセットされるという事です。実際の配列のインデックスは初期化されません。
13+
14+
var arr = new Array(3);
15+
arr[1]; // undefined
16+
1 in arr; // false, インデックスがセットされていない
17+
18+
配列の長さが先行してセットされるという振舞いは、いくつかの場合に便利です。例えば、文字の繰り返しや、`for loop`を使用したコードの回避などの場合です。
19+
20+
new Array(count + 1).join(stringToRepeat);
21+
22+
### 終わりに
23+
24+
`Array`コンストラクターの使用は出来る限り避けてください。リテラルが当然望ましい形です。それらは、短かく明快な文法にもってるいる為に、コードの可読性を高めてくれます。
25+

doc/ja/array/general.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
## 配列の繰り返しとプロパティ
2+
3+
JavaScriptの配列もまたオブジェクトですので[`for in ループ`](#object.forinloop)を配列の繰り返しで使用するような理由はありません。実際、配列に`for in`を使用**しない**為の正当な理由はたくさんあります。
4+
5+
> **注意:** JavaScriptの配列は*連想配列*では**ありません**。JavaScriptは[objects](#object.general)だけがキーバリューをマッピングするものです。
6+
> また、連想配列は順序を**保持**しますが、オブジェクトは**保持しません**
7+
8+
`for in`ループはプロトタイプチェーン上の全てのプロパティを列挙するため、[`hasOwnProperty`](#object.hasownproperty)をそれらのプロパティの存在判定に使います。この為、通常の`for`ループよりも**20倍**遅くなります。
9+
10+
### 繰り返し
11+
12+
配列の要素を繰り返すとのに、最高のパフォーマンスを出したければ昔ながらの`for`ループを使うのが一番です。
13+
14+
var list = [1, 2, 3, 4, 5, ...... 100000000];
15+
for(var i = 0, l = list.length; i < l; i++) {
16+
console.log(list[i]);
17+
}
18+
19+
上記の例では一つ余分に変数がありますが、それは配列の長さを取るための`l = list.length`の部分です。
20+
21+
また、`length`プロパティは配列自身に定義されていますが、ループのそれぞれの繰り返しで探索する為のオーバーヘッドがまだあります。最近のJavaScriptエンジンはこのような場合に最適化する**はず**です。新しいエンジンか古いエンジンで実行されるかどうかをコードが知る方法はありません。
22+
23+
実際には、キャッシュを抜きにするとループの結果はキャッシュされたものに比べて、**半分だけ高速**になっています。
24+
25+
### `length`プロパティ
26+
27+
`length`プロパティの*ゲッター*は単に配列に含まれる要素の数を返すだけにも関わらず、*セッター*は配列を**トランケート**する為にも使用できます。
28+
29+
var foo = [1, 2, 3, 4, 5, 6];
30+
foo.length = 3;
31+
foo; // [1, 2, 3]
32+
33+
foo.length = 6;
34+
foo; // [1, 2, 3]
35+
36+
より小さいlengthを割り当てると配列をトランケートしますが、lengthが大きくなっても配列には何も影響しません。
37+
38+
### 終わりに
39+
40+
最高のパフォーマンスの為には、常に`for`ループを使用し、`length`プロパティをキャッシュする事をお勧めします。`for in`ループを配列で使用するのは、バグや最低のパフォーマンスの傾向があるコードを書く前兆になります。
41+

doc/ja/core/eval.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
## なぜ、`eval`を使ってはいけないのか
2+
3+
`eval`関数はローカルスコープ中のJavaScriptコードの文字列を実行します。
4+
5+
var foo = 1;
6+
function test() {
7+
var foo = 2;
8+
eval('foo = 3');
9+
return foo;
10+
}
11+
test(); // 3
12+
foo; // 1
13+
14+
しかし、`eval`**直接**ローカルスコープから呼ばれて、*かつ*呼んだ関数の名前が実際の`eval`でないと実行しません。
15+
16+
var foo = 1;
17+
function test() {
18+
var foo = 2;
19+
var bar = eval;
20+
bar('foo = 3');
21+
return foo;
22+
}
23+
test(); // 2
24+
foo; // 3
25+
26+
`eval`の使用は**全てのコスト**を払ってでも回避するべきです。その「使用法」の99.9%で、これ**無し**でも実装できます。
27+
28+
### 偽装された`eval`
29+
30+
[timeout functions](#other.timeouts)である`setTimeout``setInterval`はどちらも最初の引数として文字列を取る事ができます。この文字列は`eval`がこの場合直接呼ばれていないので、**常に**グローバルスコープで実行されてしまいます。
31+
32+
### セキュリティの問題
33+
34+
`eval`はまたセキュリティの問題もあります。なぜなら、**どんな**コードを与えられても実行してしまうからで、**絶対**に不明または信頼できない発行元の文字列は使ってはいけません。
35+
36+
### 終わりに
37+
38+
`eval`は絶対に使用しないでください。これを使用しているどんなコードも、その働き、パフォーマンスやセキュリティについて問われてしまいます。`eval`が必要な場合でも、最初の段階で使用**しない**でください。*より良いデザイン*を使用するべきで、それには`eval`を使う必要性はありません。
39+

doc/ja/core/semicolon.md

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
## セミコロン自動挿入
2+
3+
JavaScriptはC言語スタイルのシンタックスを持っていますが、これはソースコードの中でセミコロンの使用を強制している事には**ならない**ので、これらを省略する事も可能です。
4+
5+
JavaScriptはセミコロン無しの言語ではありません。実際に、ソースコードを理解する為にもセミコロンは必要になります。ですので、JavaScriptのパーサーはセミコロンが無い事によるパースエラーを検出する度に、**自動的**にセミコロンを挿入します。
6+
7+
var foo = function() {
8+
} // セミコロンが入っている事が期待されるので、パースエラーになる
9+
test()
10+
11+
挿入が起こると、パーサーはもう一度パースします。
12+
13+
var foo = function() {
14+
}; // エラーが無いので、パーサーは次の解析をする
15+
test()
16+
17+
セミコロンの自動挿入は、コードの振る舞いを変えられる為に、言語の**最大**の欠陥の内の一つと考えられています。
18+
19+
### どのように動くか
20+
21+
以下のコードはセミコロン無いので、パーサーはどこに挿入するか決めなくてはなりません。
22+
23+
(function(window, undefined) {
24+
function test(options) {
25+
log('testing!')
26+
27+
(options.list || []).forEach(function(i) {
28+
29+
})
30+
31+
options.value.test(
32+
'long string to pass here',
33+
'and another long string to pass'
34+
)
35+
36+
return
37+
{
38+
foo: function() {}
39+
}
40+
}
41+
window.test = test
42+
43+
})(window)
44+
45+
(function(window) {
46+
window.someLibrary = {}
47+
48+
})(window)
49+
50+
下記がパーサーの「推測」ゲームの結果になります。
51+
52+
(function(window, undefined) {
53+
function test(options) {
54+
55+
// 行がマージされて、挿入されない
56+
log('testing!')(options.list || []).forEach(function(i) {
57+
58+
}); // <- 挿入
59+
60+
options.value.test(
61+
'long string to pass here',
62+
'and another long string to pass'
63+
); // <- 挿入
64+
65+
return; // <- inserted, breaks the return statement
66+
{ // ブロックとして扱われる
67+
68+
// a label and a single expression statement
69+
foo: function() {}
70+
}; // <- 挿入
71+
}
72+
window.test = test; // <- 挿入
73+
74+
// 再度行がマージされる
75+
})(window)(function(window) {
76+
window.someLibrary = {}; // <- 挿入
77+
78+
})(window); //<- 挿入
79+
80+
> **注意点:** JavaScriptパーサーは新しい行のreturn文を「正しく」返してはいないですが、
81+
> これは必要という訳では無いので自動セミコロン挿入の障害になります。
82+
> このお陰で不必要な副作用を無くす事にもなります。
83+
84+
パーサーは上記のコードの振舞いを劇的に変化させます。あるケースにおいては、**間違っている事**にもなってしまいます。
85+
86+
### 先頭の括弧
87+
88+
先頭に括弧がある場合、パーサーはセミコロンを挿入**しません**
89+
90+
log('testing!')
91+
(options.list || []).forEach(function(i) {})
92+
93+
このコードは1つの行に変形します。
94+
95+
log('testing!')(options.list || []).forEach(function(i) {})
96+
97+
`log`が関数を返さ**ない**確率は**とても**高いです。しかし、上記では`undefined is not a function`という`TypeError`が繰り返されます。
98+
99+
### 終わりに
100+
101+
セミコロンを省略するのは**絶対**にお勧めしません。この事はまた括弧をその終端と一緒の行に書く事が推奨されてますし、1つの`if``else`文を絶対に省略してはなりません。これら両方の処理がコードの整合性を高めてくれる上、JavaScriptパーサーの振舞いを変えてしまうのを防いでくれるでしょう。

doc/ja/core/undefined.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
## `undefined``null`
2+
3+
JavaScriptは`nothing`を表す2つの別個の値を持っています。`undefined`はこれら2つの内より便利な存在です。
4+
5+
### `undefined`の値
6+
7+
`undefined`はただ1つの値`undefined`を持つ型です。
8+
9+
この言語はまた、`undefined`の値を持つグローバル変数を定義しています。この値もまた`undefined`と呼ばれています。しかし、この変数は **どちらも** 言語のキーワードではなく、定数です。この事はこの**は簡単に上書きされてしまうという事になります。
10+
11+
> **ES5での注意点:** ECMAScript 5での`undefined`**もはや** strict modeでは *書き変えられない*
12+
> ようになっています。しかし、この名前は`undefined`という名前の関数の例に痕跡が見られるだけです。
13+
14+
`undefined`が帰される時の例をいくつか挙げます。
15+
16+
- (未定義の)グローバル変数`undefined`にアクセスした時
17+
- `return`文が無い為に、暗黙のうちに関数が返された時
18+
- 何も返されない`return`がある時
19+
- 存在しないプロパティを探索する時
20+
- 関数のパラメーターで明示的な値が何も無い時
21+
- 全ての`undefined`が設定された値
22+
23+
### `undefined`の値に変更する処理
24+
25+
グローバル変数`undefined`のみが実際の`undefined`**のコピーを保持するので、これに新しい値を代入しても`undefined`** の値が変更される事は**ありません**
26+
27+
まだ、`undefined`の値に対して何かしらの比較をしないといけない場合は、最初に`undefined`の値を取得する必要があります。
28+
29+
コードの`undefined`の変数の上書きを可能な限りしないよう保護する為には、一般的なテクニックとして[anonymous wrapper](#function.scopes)の引数にパラメーターを追加するというものがあります。
30+
31+
var undefined = 123;
32+
(function(something, foo, undefined) {
33+
// ローカルスコープではundefined。
34+
// ここで値に対して参照がされる
35+
36+
})('Hello World', 42);
37+
38+
同じ効果を得る事ができる別の方法として、ラッパーの内部での宣言を使うものがあります。
39+
40+
var undefined = 123;
41+
(function(something, foo) {
42+
var undefined;
43+
...
44+
45+
})('Hello World', 42);
46+
47+
これらの唯一の違いは、こちらのバージョンの方が4バイト余計に短縮できるという物です。また、他に`var`ステートメントは匿名ラッパーの中にはありません。
48+
49+
### `null`の使用
50+
51+
JavaScriptというプログラム言語のコンテキストの中では、`undefined`は主に伝統的な意味での*null*の意味で使用される事が多いです。実際の`null`(リテラルも型も両方)は多かれ少なかれ、単なるデータ型です。
52+
53+
それはJavaScriptの内部でいくつか使われています(プロトタイプチェーンの終わりに`Foo.prototype = null`という宣言をするようなもの)が、ほとんど全てのケースで、`undefined`に置き替える事が可能です。

doc/ja/function/arguments.md

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
## オブジェクトの`arguments`
2+
3+
JavaScriptの全ての関数スコープは`arguments`と呼ばれる特別な変数にアクセスできます。この変数は関数が受け取った全ての引数を保持する変数です。
4+
5+
> **注意:** `arguments`が既に`var`や正式なパラメーターにより
6+
> 関数のスコープが定義されている場合は
7+
> `arguments`オブジェクトは作られません。
8+
9+
`arguments`オブジェクトは`Array`では**ありません**。これは配列と同じような -`length`プロパティと名付けられています- 文法を持っていますが、`Array.prototype`を継承している訳では無いので、実際`Object`になります。
10+
11+
この為、`arguments``push``pop``slice`といった通常の配列メソッドは使用する事が**出来ません**。プレーンな`for`ループのような繰り返しでは上手く動作しますが、通常の`Array`メソッドを使いたい場合は本当の`Array`に変換しなければなりません。
12+
13+
### 配列への変換
14+
15+
下のコードは`arguments`オブジェクトの全ての要素を含んだ新しい`Array`を返します。
16+
17+
Array.prototype.slice.call(arguments);
18+
19+
この変換は**遅い**です。コードのパフォーマンスに関わる重要な部分での使用は**推奨しません**
20+
21+
### 引き数の受け渡し
22+
23+
下記の例はある関数から別の関数に引数を引き渡す際に推奨される方法です。
24+
25+
function foo() {
26+
bar.apply(null, arguments);
27+
}
28+
function bar(a, b, c) {
29+
// do stuff here
30+
}
31+
32+
他のテクニックとして、高速で非結合のラッパーとして`call``apply`両方を一緒に使用するという物があります。
33+
34+
function Foo() {}
35+
36+
Foo.prototype.method = function(a, b, c) {
37+
console.log(this, a, b, c);
38+
};
39+
40+
// "メソッド"の非結合バージョンを作成する
41+
// このメソッドはthis, arg1, arg2...argNのパラメーターを持っている
42+
Foo.method = function() {
43+
44+
// 結果: Foo.prototype.method.call(this, arg1, arg2... argN)
45+
Function.call.apply(Foo.prototype.method, arguments);
46+
};
47+
48+
49+
### 仮パラメーターと引数のインデックス
50+
51+
`arguments`オブジェクトは*ゲッター**セッター*機能を自身のプロパティと同様に関数の仮パラメーターとして作成します。
52+
53+
結果として、仮パラメーターを変更すると`arguments`の対応する値も変更されますし、逆もしかりです。
54+
55+
function foo(a, b, c) {
56+
arguments[0] = 2;
57+
a; // 2
58+
59+
b = 4;
60+
arguments[1]; // 4
61+
62+
var d = c;
63+
d = 9;
64+
c; // 3
65+
}
66+
foo(1, 2, 3);
67+
68+
### パフォーマンスの神話と真実
69+
70+
`arguments`オブジェクトは、関数の内部の名前宣言と仮パラメーターという2つの例外を常に持ちながら生成されます。これは、使用されているかどうかは関係がありません。
71+
72+
*ゲッター**セッター*は両方とも**常に**生成されます。その為これを使用してもパフォーマンスに影響は全くといって言い程ありません。`arguments`オブジェクトのパラメーターに単純にアクセスしているような、実際のコードであれば尚更です。
73+
74+
> **ES5での注意:** strictモードでは、これら*ゲッター**セッター*は生成されません。
75+
76+
しかし、一つだけモダンJavaScriptエンジンにおいて劇的にパフォーマンスが低下するケースがあります。そのケースとは`arguments.callee`を使用した場合です。
77+
78+
function foo() {
79+
arguments.callee; // この関数オブジェクトで何かする
80+
arguments.callee.caller; // そして関数オブジェクトを呼び出す
81+
}
82+
83+
function bigLoop() {
84+
for(var i = 0; i < 100000; i++) {
85+
foo(); // 通常はインライン展開する
86+
}
87+
}
88+
89+
上記のコードでは、`foo`は自身と自身の呼び出し元の両方を知らないと[インライン展開][1]の対象になる事が出来ません。この事は、インライン展開によるパフォーマンスの向上の機会を失くす事になり、また、特定のコンテクストの呼び出しに依存する関数のせいで、カプセル化が解除されてしまいます。
90+
91+
この為に`arguments.callee`を使用または、そのプロパティを**決して**使用しない事を**強く推奨**します。
92+
93+
> **ES5での注意:** strictモードでは、`arguments.callee`は推奨されていない為に
94+
> `Typeerror`が返るようになっています。
95+
96+
[1]: http://en.wikipedia.org/wiki/Inlining
97+
98+

0 commit comments

Comments
 (0)