Skip to content

Commit 9e82a07

Browse files
committed
Merge pull request BonsaiDen#130 from Layzie/ja
improve translation on japanese and translate "delete operator"
2 parents bfe384a + 698ff8e commit 9e82a07

File tree

17 files changed

+135
-59
lines changed

17 files changed

+135
-59
lines changed

doc/ja/array/general.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 配列の繰り返しとプロパティ
22

3-
JavaScriptの配列もまたオブジェクトですので[`for in ループ`](#object.forinloop)を配列の繰り返しで使用するような理由はありません。実際、配列に`for in`を使用**しない**為の正当な理由はたくさんあります。
3+
JavaScriptの配列もまたオブジェクトですが、[`for in ループ`](#object.forinloop)を配列の繰り返し処理で使用することの良い理由は1つもありません。実際、配列に`for in`を使用**しない**為の正当な理由はたくさんあります。
44

55
> **注意:** JavaScriptの配列は*連想配列*では**ありません**。JavaScriptは[objects](#object.general)だけがキーバリューをマッピングするものです。
66
> また、連想配列は順序を**保持**しますが、オブジェクトは**保持しません**
@@ -16,11 +16,11 @@ JavaScriptの配列もまたオブジェクトですので[`for in ループ`](#
1616
console.log(list[i]);
1717
}
1818

19-
上記の例では一つ余分に変数がありますが、それは配列の長さを取るための`l = list.length`の部分です
19+
上記の例では1つ追加の仕掛けがありますが、それは`l = list.length`によって配列の長さをキャッシュする部分です
2020

21-
また、`length`プロパティは配列自身に定義されていますが、ループのそれぞれの繰り返しで探索する為のオーバーヘッドがまだあります。最近のJavaScriptエンジンはこのような場合に最適化する**はず**です。新しいエンジンか古いエンジンで実行されるかどうかをコードが知る方法はありません
21+
`length`プロパティは配列自身に定義されてはいますが、ループ中の繰り返しで毎回これを参照してしまうと、やはりオーバーヘッドが存在してしまいます。最近のJavaScriptエンジンはこのような場合に最適化する**はず**ですが、コードが新しいエンジンで実行されるかどうか、知る方法はありません
2222

23-
実際には、キャッシュを抜きにするとループの結果はキャッシュされたものに比べて、**半分だけ高速**になっています
23+
実際には、キャッシュを抜きにするとループの結果はキャッシュされたものに比べてたった**半分の速度**にしかなりません
2424

2525
### `length`プロパティ
2626

doc/ja/core/delete.md

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
## `delete`演算子
2+
3+
端的に言って、JavaScriptの関数やその他の要素は`DontDelete`属性が設定されているので、グローバル変数を消去する事は*不可能*です。
4+
5+
### グローバルコードと関数コード
6+
7+
変数や、関数がグローバルまたは[関数スコープ](#function.scopes)で定義された時は、そのプロパティは有効なオブジェクトかグローバルオブジェクトになります。このようなプロパティは属性のセットを持っていますが、それらの内の1つが`DontDelete`になります。変数や関数がグローバルや関数コードで宣言されると、常に`DontDelete`属性を作るために、消去できません。
8+
9+
// グローバル変数:
10+
var a = 1; // DontDelete属性が設定される
11+
delete a; // false
12+
a; // 1
13+
14+
// 通常関数:
15+
function f() {} // DontDelete属性が設定される
16+
delete f; // false
17+
typeof f; // "function"
18+
19+
// 再代入も役に立たない:
20+
f = 1;
21+
delete f; // false
22+
f; // 1
23+
24+
### 明示的なプロパティ
25+
26+
普通にプロパティを消去できる方法が存在します:プロパティを明示的に設定するのです。
27+
28+
// プロパティを明示的に設定する
29+
var obj = {x: 1};
30+
obj.y = 2;
31+
delete obj.x; // true
32+
delete obj.y; // true
33+
obj.x; // undefined
34+
obj.y; // undefined
35+
36+
上記の例の中で、`obj.x``obj.y`はそれぞれ`DontDelete`属性が無い為に削除できます。これが下記の例でも動作する理由です。
37+
38+
// IE以外では、これも動作する
39+
var GLOBAL_OBJECT = this;
40+
GLOBAL_OBJECT.a = 1;
41+
a === GLOBAL_OBJECT.a; // true - ただのグローバルのvar
42+
delete GLOBAL_OBJECT.a; // true
43+
GLOBAL_OBJECT.a; // undefined
44+
45+
ここでは`a`. [`this`](#function.this)を消す為にグローバルオブジェクトと明示的に宣言した`a`をそのプロパティとして参照させて、消去する事を許可するトリックを使います。
46+
47+
IE(最低でも6-8で)は多少のバグがある為に、上記のコードは動作しません。
48+
49+
50+
### 関数の引数と組み込み引数
51+
52+
関数の通常の引数である、[`arguments` object](#function.arguments)と組み込みのプロパティもまた、`DontDelete`が設定されています。
53+
54+
// 関数の引数とプロパティ:
55+
(function (x) {
56+
57+
delete arguments; // false
58+
typeof arguments; // "object"
59+
60+
delete x; // false
61+
x; // 1
62+
63+
function f(){}
64+
delete f.length; // false
65+
typeof f.length; // "number"
66+
67+
})(1);
68+
69+
### ホストオブジェクト
70+
71+
`delete`演算子の挙動はホストオブジェクトにとって予測不可能になりかねません。仕様によりホストオブジェクトは、あらゆる挙動の実行が許可されている為です。
72+
73+
### 終わりに
74+
75+
`delete`演算子は、しばしば予期せぬ挙動をします。唯一安全な仕様方法は通常のオブジェクトに明示的に設定されたプロパティを扱う場合だけです。

doc/ja/core/semicolon.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,10 @@ JavaScriptはセミコロン無しの言語ではありません。実際に、
7777

7878
})(window); //<- 挿入
7979

80-
> **注意点:** JavaScriptパーサーは新しい行のreturn文を「正しく」返してはいないですが、
81-
> これは必要という訳では無いので自動セミコロン挿入の障害になります。
82-
> このお陰で不必要な副作用を無くす事にもなります。
80+
> **注意点:** JavaScriptパーサーは、すぐ後に改行が続く return文を正しく扱いません。
81+
> これは必ずしも自動セミコロン挿入の欠点によるものではありませんが、
82+
> それもまた望まない副作用となりえます。
83+
8384

8485
パーサーは上記のコードの振舞いを劇的に変化させます。あるケースにおいては、**間違っている事**にもなってしまいます。
8586

@@ -98,4 +99,4 @@ JavaScriptはセミコロン無しの言語ではありません。実際に、
9899

99100
### 終わりに
100101

101-
セミコロンを省略するのは**絶対**にお勧めしません。この事はまた括弧をその終端と一緒の行に書く事が推奨されてますし、1つの`if``else`文を絶対に省略してはなりません。これら両方の処理がコードの整合性を高めてくれる上、JavaScriptパーサーの振舞いを変えてしまうのを防いでくれるでしょう。
102+
セミコロンを省略するのは**絶対**にお勧めしません。括弧を対応する文と同じ行に記述すること、および一行の`if / else`文に対して括弧を省略しないことが推奨されています。これら両方の処理がコードの整合性を高めてくれるだけでなく、JavaScriptパーサーの振舞いを変えてしまうのを防いでくれるでしょう。

doc/ja/core/undefined.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## `undefined``null`
22

3-
JavaScriptは`nothing`を表す2つの別個の値を持っています。`undefined`はこれら2つの内より便利な存在です
3+
JavaScriptは`nothing`を表す2つの別個の値を持っています。これら2つの内で`undefined`はより便利な存在です
44

55
### `undefined`の値
66

@@ -11,14 +11,14 @@ JavaScriptは`nothing`を表す2つの別個の値を持っています。`undef
1111
> **ES5での注意点:** ECMAScript 5での`undefined`**もはや** strict modeでは *書き変えられない*
1212
> ようになっています。しかし、この名前は`undefined`という名前の関数の例に痕跡が見られるだけです。
1313
14-
`undefined`が帰される時の例をいくつか挙げます
14+
`undefined`が返される時の例をいくつか挙げます
1515

1616
- (未定義の)グローバル変数`undefined`にアクセスした時
1717
- `return`文が無い為に、暗黙のうちに関数が返された時
1818
- 何も返されない`return`がある時
1919
- 存在しないプロパティを探索する時
2020
- 関数のパラメーターで明示的な値が何も無い時
21-
- 全ての`undefined`が設定された値
21+
- `undefined`が設定された全ての値
2222

2323
### `undefined`の値に変更する処理
2424

doc/ja/function/arguments.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
JavaScriptの全ての関数スコープは`arguments`と呼ばれる特別な変数にアクセスできます。この変数は関数が受け取った全ての引数を保持する変数です。
44

55
> **注意:** `arguments`が既に`var`や正式なパラメーターにより
6-
> 関数のスコープが定義されている場合は
6+
> 関数のスコープ内部で定義されている場合は
77
> `arguments`オブジェクトは作られません。
88
99
`arguments`オブジェクトは`Array`では**ありません**。これは配列と同じような -`length`プロパティと名付けられています- 文法を持っていますが、`Array.prototype`を継承している訳では無いので、実際`Object`になります。

doc/ja/function/closures.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## クロージャと参照
22

3-
JavaScriptの一番パワフルな特徴の一つとして*クロージャ*が使える事が挙げられます。これはスコープが**いつも**外部に定義されたスコープにアクセスできるという事です。JavaScriptの唯一のスコープは[関数スコープ](#function.scopes)ですが、全ての関数は標準でクロージャとして振る舞います。
3+
JavaScriptの一番パワフルな特徴の一つとして*クロージャ*が使える事が挙げられます。これはスコープが自身の定義されている外側のスコープに**いつでも**アクセスできるという事です。JavaScriptの唯一のスコープは[関数スコープ](#function.scopes)ですが、全ての関数は標準でクロージャとして振る舞います。
44

55
### プライベート変数をエミュレートする
66

@@ -32,7 +32,7 @@ JavaScriptでは、スコープ自体を参照・代入する事が出来無い
3232
count = 1337;
3333
};
3434

35-
上記のコードは`Counter`のスコープ中にある変数`count`の値を変更する事は**ありません**`foo.hack`**その**スコープで定義されていないからです。これは*グローバル*変数`count`の作成 -またはオーバーライド- の代わりになるでしょう
35+
上記のコードは`Counter`のスコープ中にある変数`count`の値を変更する事は**ありません**`foo.hack`**その**スコープで定義されていないからです。これは(`Counter`内の変数`count`の変更)の代わりに*グローバル*変数`count`の作成 -または上書き- する事になります
3636

3737
### ループ中のクロージャ
3838

@@ -64,9 +64,9 @@ JavaScriptでは、スコープ自体を参照・代入する事が出来無い
6464

6565
外部の匿名関数は`i`を即座に第一引数として呼び出し、引数`e``i`****のコピーとして受け取ります。
6666

67-
`e`を参照している`setTimeout`を受け取った匿名関数はループによって値が変わる事が**ありません**
67+
`e`を参照している`setTimeout`を受け取った匿名関数はループによって値が変わる事が**ありません**
6868

69-
他にこのような事を実現する方法があります。それは匿名ラッパーから関数を返してあげる事です。これは上記のコードと同じような効果があります
69+
他にこのような事を実現する方法があります。それは匿名ラッパーから関数を返してあげる事です。これは上記のコードと同じ振る舞いをします
7070

7171
for(var i = 0; i < 10; i++) {
7272
setTimeout((function(e) {

doc/ja/function/constructors.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
JavaScriptのコンストラクタは色々ある他のプログラム言語とは一味違います。`new`キーワードが付いているどんな関数呼び出しも、コンストラクタとして機能します。
44

5-
コンストラクタ内部では -呼び出された関数の事です- `this`の値は新規に生成された`Object`を参照しています。この**新規**のオブジェクトの[`prototype`](#object.prototype)は、コンストラクタとして起動した関数オブジェクトの`prototype`として設定されています
5+
コンストラクタ内部では -呼び出された関数の事です- `this`の値は新規に生成された`Object`を参照しています。この**新規**のオブジェクトの[`prototype`](#object.prototype)は、コンストラクタとして起動した関数オブジェクトの`prototype`に設定されています
66

77
もし呼び出された関数が、`return`ステートメントを明示していない場合は、暗黙の了解で`this`の値を -新規のオブジェクトとして- 返します。
88

@@ -16,9 +16,9 @@ JavaScriptのコンストラクタは色々ある他のプログラム言語と
1616

1717
var test = new Foo();
1818

19-
上記で`Foo`はコンストラクタとして呼び出され、`Foo.prototype`として新規に生成された`prototype`を設定されています
19+
上記は、`Foo`をコンストラクタとして呼び出し、新規に生成されたオブジェクトの`prototype``Foo.prototype`に設定しています
2020

21-
明示的に`return`ステートメントがある場合、`Object`の値を返す**だけでなく**関数はこのステートメントを返します
21+
明示的に`return`ステートメントがある場合、関数は返り値が`Object`である場合に**限り**ステートメントで明示した値を返します
2222

2323
function Bar() {
2424
return 2;
@@ -41,7 +41,7 @@ JavaScriptのコンストラクタは色々ある他のプログラム言語と
4141
}
4242
Foo(); // undefinedが返る
4343

44-
上記の例では、いくつかのケースでは動作するように見える場合があります。JavaScriptの[`this`](#function.this)の働きのせいで、*グローバルオブジェクト*`this`の値として使用されるからです。
44+
JavaScriptの[`this`](#function.this)の働きのせいで、上記の例ではいくつかのケースでは動作するように見える場合がありますが、それは*グローバルオブジェクト*`this`の値として使用されるからです。
4545

4646
### ファクトリー
4747

@@ -64,16 +64,16 @@ JavaScriptのコンストラクタは色々ある他のプログラム言語と
6464

6565
`Bar`で呼び出されたものは両方とも全く同じものものになります。これには、`method`と呼ばれるプロパティを持ったオブジェクトが新しく生成されますが、これは[クロージャ](#function.closures)です。
6666

67-
また、注意する点として呼び出された`new Bar()`は返ってきたオブジェクトのプロトタイプに影響**しません**プロトタイプが新しく生成されたオブジェクトにセットされるまで`Bar`は絶対に新しいオブジェクトを返さないのです
67+
また、注意する点として呼び出された`new Bar()`は返ってきたオブジェクトのプロトタイプに影響**しません**プロトタイプは新しく生成されたオブジェクトにセットされはしますが`Bar`は絶対にその新しいオブジェクトを返さないのです
6868

6969
上記の例では、`new`キーワードの使用の有無は機能的に違いがありません。
7070

7171

7272
### ファクトリーとして新しくオブジェクトを作成する
7373

74-
大半の場合に推奨されるのは`new`の付け忘れによるバグを引き起こしやすいので使用**しない**事です
74+
多くの場合に推奨される事として`new`の付け忘れによるバグを引き起こしやすいので、`new`を使用**しない**ようにするという事があります
7575

76-
新しいオブジェクトを作成するためにファクトリーを使用するか、そのファクトリー内部に新しいオブジェクトを構築する必要があります
76+
新しいオブジェクトを作成するためにファクトリーを使用して、そのファクトリー内部に新しいオブジェクトを作成すべきだという事です
7777

7878
function Foo() {
7979
var obj = {};
@@ -98,6 +98,6 @@ JavaScriptのコンストラクタは色々ある他のプログラム言語と
9898

9999
### 終わりに
100100

101-
`new`キーワードが省略される事により、バグの可能性がもたらされますがプロトタイプを使わない確実な理由には**なりません**。最終的には、アプリケーションの必要性により、どちらの解決法がより良いかが決まってきます。特に大切なのは、オブジェクトの作成に特定のスタイルを選ぶ事、また**そのスタイルに固執する事**です。
101+
`new`キーワードが省略される事によりバグの可能性がもたらされますが、それによりプロトタイプを全く使わないという確かな理由には**なりません**。最終的には、アプリケーションの必要性により、どちらの解決法がより良いかが決まってきます。特に大切なのは、オブジェクトの作成に特定のスタイルを選ぶ事、また**そのスタイルに固執する事**です。
102102

103103

doc/ja/function/general.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 関数の宣言と式
22

3-
関数はJavaScriptの第一級オブジェクトです。この事は、その他の値と同じように渡す事が出来るという事です。この機能で良く使われる一つとして**匿名関数**を他のオジェクトにコールバックとして渡すというものがあり、これで非同期での実装が可能になります。
3+
関数はJavaScriptの第一級オブジェクトです。この事は、その他の値と同じように渡す事が出来るという事です。この機能で良く使われる一つとして**匿名関数**を他のオブジェクトにコールバックとして渡すというものがあり、これで非同期での実装が可能になります。
44

55
### `関数`宣言
66

@@ -25,14 +25,13 @@
2525

2626
しかし、コードの実行時にのみこの割り当てがされるため、`foo`という変数は対応するコードが実行される前にデフォルト値である[undefined](#core.undefined)が代入されるのです。
2727

28-
### 名前付き関数宣言
28+
### 名前付き関数式
2929

30-
他に特殊なケースとして、命名関数があります
30+
他に特殊なケースとして、名前付き関数があります
3131

3232
var foo = function bar() {
3333
bar(); // 動作する
3434
}
3535
bar(); // ReferenceError
3636

37-
この場合の`bar``foo`に対して関数を割り当てるだけなので、外部スコープでは使用できません。しかし、`bar`は内部では使用できます。これはJavaScriptでは[名前解決](#function.scopes)による動作です。関数名は*いつも*関数自体のローカルスコープ内で有効になっています。
38-
37+
この場合の`bar``foo`に対して関数を割り当てるだけなので、外部スコープでは使用できません。しかし、`bar`は内部では使用できます。これはJavaScriptの[名前解決](#function.scopes)の方法によるもので、関数名は*いつも*関数自身のローカルスコープ内で有効になっています。

0 commit comments

Comments
 (0)