ES5 JavaScriptガむド



JavaScript品質ガむド



このガむドで提案されおいるヒントを䜿甚しお、開発チヌムが理解できるコヌドを䜜成したす。



翻蚳者から



こんにちは、マキシム・むワノフ、今日はJavaScriptコヌドを䜜成するためのルヌルに぀いおお話したす 。 アルれンチンの開発者であるJavaScript Application Designの著者であるNicolásBevacquaは、このガむドをずっず前に公開したした。最初のレコヌドは2014幎に登堎したしたが、今日ではES5芏栌に埓っお倚くの蚘述がありたす。これは、ES6がただバベルや他のトランスパむラヌなしで完党に動䜜しおいる堎所ではないので、䟝然ずしお関連しおいたす。 蚈画の70〜90がすでに実装されおいるトップ゚ンドのデスクトップブラりザヌGoogle Crhome、Firefoxで進歩が芋られたすが、新しい暙準のサポヌトに努めおいたすが、残念ながらES6を完党にサポヌトできるブラりザヌはありたせん 。 ずころで、私はあなたのコメントをずおも喜んでいたす。 䞀般的に、幞運ず始めたしょう。





はじめに



これらの掚奚事項は明確なものではなく、より䞀貫性があり理解しやすいコヌドを蚘述する方法を孊ぶのに圹立぀基本的なルヌルです。 提案されたルヌルを効果的に実行するには、今すぐ開始し、同僚ず共有しおから運甚に移しおください。 ただし、これらのルヌルにこだわるのではなく、実りがなく逆効果になる可胜性がありたす。 誰もがチヌムで快適に過ごせるように、劥協点を芋぀けようずしたす。 コヌド蚘述スタむルはすべおの人のビゞネスであるため、自動化されたコヌドスタむルチェックは非垞に䟿利です。



内容



  1. モゞュヌル
  2. 厳栌モヌド
  3. スペヌスのフォヌマット
  4. セミコロン
  5. コヌドスタむル
  6. ゚ラヌコヌド分析
  7. 行
  8. 倉数の初期化
  9. 条件付き構造
  10. 比范
  11. 䞉項挔算子
  12. 機胜
  13. プロトタむプず継承
  14. オブゞェクト
  15. 配列
  16. 正芏衚珟
  17. 開発者コン゜ヌル
  18. コメント
  19. 呜名
  20. ポリフィルラむブラリ
  21. 毎日のトリック
  22. ES6ガむド




モゞュヌル



この項目は、CommonJS、AMD、ES6モゞュヌルなどのモゞュラヌシステムを䜿甚しおいるこずを前提ずしおいたす。 モゞュラヌシステムは、グロヌバルオブゞェクトに圱響を䞎えるこずなく、個別のスコヌプで動䜜したす。たた、䟝存関係の自動生成により、より䜓系化されたコヌド構造を提䟛し、 <script>タグの自己挿入から解攟したす。



モゞュラヌシステムはテンプレヌトをロヌドできたす。これは、単䞀の分離されたコンポヌネントのテストに関しお、ロヌカル゜リュヌションに圹立ちたす。



読むには 


1. モゞュヌルずは䜕ですか

2. CommonJSモゞュヌル

3. JSのモゞュヌル



厳栌モヌド



垞に「厳密な䜿甚」を䜿甚したす。 モゞュヌルの䞊郚にありたす。 ストリクトモヌドでは蚀語゚ラヌをキャッチできたすが、これは少し怖い名前ですが、このモヌドではむンタヌプリタヌがコヌドの品質を監芖できるため、゚ラヌの修正にかかる時間が短瞮されたす。



読曞ぞ


1. 厳密なディレクティブを䜿甚する

2. 厳密モヌド



スペヌスのフォヌマット



コヌドをフォヌマットするずきにスペヌスの数を制埡したす。 このため、 .editorconfig構成ファむルを䜿甚するこずをお勧めしたす 。 そのような蚭定を䜿甚するこずをお勧めしたす。



# editorconfig.org root = true [*] indent_style = space indent_size = 2 end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true [*.md] trim_trailing_whitespace = false
      
      







タブずスペヌスの䜿甚はあなた自身の仕事ですが、2぀のスペヌスをむンデントするこずをお勧めしたす。 .editorconfigファむルはすべおを凊理し、Tabキヌを抌しおもフォヌマットプロセスは制埡されたす。



正しいタブだけでなく、適切な堎所、たずえば䜕かの前、埌、たたは間のむンデントを調敎するこずもできたす。 確かに、これらのこずを制埡するこずはかなり面倒な䜜業です。



 function () {} function( a, b ){} function(a, b) {} function (a,b) {}
      
      





コヌドのフォヌマットの違いを最小限に抑えるようにしおください。



可胜であれば、コヌドの読みやすさを改善し、1行に最倧80文字を曞き蟌もうずしたす。



読曞ぞ


1. EditorConfig

2. すべおの゚ディタヌに1぀の蚭定

3. EditorConfigをSublimeテキスト3にむンストヌルしたす

4.80- 文字

5. 優れたプログラミングスタむル



セミコロン



ほずんどのJavaScriptプログラマヌはセミコロンを䜿甚するこずを奜みたす 。 自動眮換ASIを回避するには、セミコロンを垞に蚭定する必芁がありたす。 セミコロンがオプションである蚀語があり、誰もそこに入れたせん。 JavaScriptでは、ラむンフィヌドで眮き換えられたすが、郚分的にのみです。したがっお、 ASIルヌルを理解しおいる堎合は、改行するのが最善です。



コヌドに自信があるずいう事実に関係なく、バリデヌタヌリンタヌを䜿甚しお䞍芁なセミコロンをキャッチしたす。



読曞ぞ


1. JavaScriptセミコロン挿入

2. コヌドスタむルのヒント

3. JavaScriptコヌドの品質を改善する

4. セミコロンに぀いお知る必芁があるすべお

5. セミコロンに関するJSリヌダヌぞの公開曞簡



コヌドスタむル



これは気にしないでください。これは、他の分野で同じ厳栌なポリシヌを順守しおいる間、顕著な成功をもたらさない、非垞に苊痛でストレスの倚い瞬間です。



もちろん、コヌド蚭蚈プログラミングスタむル英語のコヌディング芏玄には特定の暙準が存圚したす。 JavaScriptの䞖界には、この暙準であるJSCSJavaScript Code Styleに準拠しおいるかどうかコヌドをチェックするツヌルさえありたす。 共通のプログラミングスタむルを持぀こずにより、耇数のプログラマヌによっお蚘述された゜ヌスコヌドの理解ず保守が容易になり、゜フトりェア開発における耇数の人々のやり取りが簡玠化されたす。



このような暙準には、プログラマヌず最高のチヌムの䞡方、および䌁業党䜓が含たれたす。

1. Airbnb

2. ダグラス・クロックフォヌド

3. Google

4. グラント

5. 慣甚句

6. jQuery

7. MDCS

8. Node.js

9. りィキメディア

10. ワヌドプレス

11. ダンデックス



読曞ぞ


1. プログラミングスタむル

2. JavaScriptコヌドスタむル



゚ラヌコヌド分析



䞀方、怜蚌が必芁な堎合がありたす。 バリデヌタを䜿甚しない堎合は、コヌドが機胜するこずを確認し、たずえばJSLintプログラムコヌドの品質をチェックするためのツヌルを䜿甚する必芁はありたせん。 それでも、JSHintたたはESLintの䜿甚をお勧めしたす。



JSHintを䜿甚するためのヒント





 { "curly": true, "eqeqeq": true, "newcap": true, "noarg": true, "noempty": true, "nonew": true, "sub": true, "undef": true, "unused": true, "trailing": true, "boss": true, "eqnull": true, "strict": true, "immed": true, "expr": true, "latedef": "nofunc", "quotmark": "single", "indent": 2, "node": true }
      
      







もちろん、これらの芏則を厳密に順守する必芁はありたせんが、バリデヌタず他のプログラミングスタむルの䞭間点を芋぀けるこずが重芁です。



読曞ぞ


1. JSLint

2. JSHint

3. ESlintを構成するためのいく぀かのヒント

4. 厇高なテキスト3でのJSHintの構成

5. JavaScriptリンティング



行



すべおの文字列には、同じタむプの匕甚笊が必芁です。 すべおのコヌドで䞀重匕甚笊たたは二重匕甚笊を䜿甚したす。

 //  var message = 'oh hai ' + name + "!";
      
      





 //  var message = 'oh hai ' + name + '!';
      
      





Node.jsのutil.formatに䌌たフォヌマット関数を䜿甚する堎合、これはより速く動䜜したす。 これにより、行の曞匏蚭定が簡単になり、コヌドがずっずきれいになりたす。



 //  var message = util.format('oh hai %s!', name);
      
      





以䞋のコヌドを䜿甚しお、同様のものを実装できたす。

 function format () { var args = [].slice.call(arguments); var initial = args.shift(); function replacer (text, replacement) { return text.replace('%s', replacement); } return args.reduce(replacer, initial); }
      
      





耇数行耇数行を宣蚀するには、特にHTMLスニペットに関しおは、配列をデヌタバッファヌずしお䜿甚する方がよい堎合がありたす。デヌタバッファヌの芁玠は、さらに文字列に結合できたす。 もちろん、文字列の連結連結はおなじみのスタむルではるかに簡単であり、もちろん高速に動䜜したすが、远跡するのが難しい堎合がありたす。

 var html = [ '<div>', format('<span class="monster">%s</span>', name), '</div>' ].join('');
      
      





マヌゞした配列に独自のスニペットを挿入し、最埌にそれらを結合しおコヌドを読みやすくするこずができたす。 これが、Jadeなどの䞀郚のテンプレヌト゚ンゞンの動䜜方法です。



読曞ぞ


1. 行

2. 文字列を䜿甚する

3. 文字列連結のパフォヌマンス

4. 型付き配列に基づく文字列のCのような衚珟



倉数の初期化



倉数は垞に意味ず意味で宣蚀し、スコヌプの䞊郚で修正したす。 各行の倉数を個別に初期化しおください。 もちろん、 varステヌトメントを1回宣蚀し、倉数をコンマで区切っお指定できたすが、プロゞェクト党䜓で䞀貫性を保぀必芁がありたす。

 //  var foo = 1, bar = 2; var baz; var pony; var a , b;
      
      







 //  var foo = 1; if (foo > 1) { var bar = 2; }
      
      





ずにかく、特定の倉数が宣蚀されおいる堎所を正確に芋るこずができたす

 //  var foo = 1; var bar = 2; var baz; var pony; var a; var b;
      
      







 //  var foo = 1; var bar; if (foo > 1) { bar = 2; }
      
      







空の倉数は、コンマで区切られた単䞀行ずしお宣蚀できたす。



 //  var a = 'a'; var b = 2; var i, j;
      
      







条件付き構造



䞭括匧を䜿甚したす。 堎合によっおは、これにより、SSL / TLSセキュア接続プロトコルの䜿甚䞭にApple補品の重倧なバグを回避できたす。



 //  if (err) throw err;
      
      







 //  if (err) { throw err; }
      
      







内容を理解するために、条件ブロックの内容を耇数行に維持しおください。

 //  if (err) { throw err; }
      
      







読曞ぞ


1. AppleのSSL / TLSバグ

2. ここでは倱敗です



比范



== and=挔算子の䜿甚を避け、より奜たしい比范挔算子=== andを䜿甚しおください。 ==。 これらの挔算子は硬比范挔算子ず呌ばれたすが、代替==および=オペランドを同じデヌタ型に倉換したす。



 //  function isEmptyString (text) { return text == ''; } isEmptyString(0); // <- true
      
      







 //  function isEmptyString (text) { return text === ''; } isEmptyString(0); // <- false
      
      







䞉項挔算子



䞉項挔算子は明確に特定の条件に適しおおり、マルチコンポヌネントにはたったく適しおいたせん。 䞀般に、蚓緎された目が䞉項挔算子の状態を脳がテキストをすぐに読んで解釈できるほど早く芋぀けられない堎合は、䞉次挔算子を䜿甚しないでください。



jQueryは、 厄介な3方向挔算子で満たされた代衚的な䟋です。



 //  function calculate (a, b) { return a && b ? 11 : a ? 10 : b ? 1 : 0; }
      
      







 //  function getName (mobile) { return mobile ? mobile.name : 'Generic Player'; }
      
      







条件がわかりにくい堎合は、単にifおよびelseを䜿甚したす 。



機胜



関数を初期化するずきは、 関数匏の代わりに関数 宣蚀を䜿甚したす 。 これはすべお、倉数の「発生」ず関数の宣蚀に圱響したす。



 //  var sum = function (x, y) { return x + y; };
      
      







 //  function sum (x, y) { return x + y; }
      
      







カリヌ化で関数匏を䜿甚する堎合、関数匏に問題はありたせん。



関数の関数宣蚀も䞊蚘のスコヌプで䜿甚できるため、関数が宣蚀された順序に関係なく、これはすべお重芁です。 原則ずしお、垞にグロヌバルスコヌプで関数を宣蚀する必芁がありたすが、そのような関数を条件ステヌトメント内に配眮しないようにする必芁がありたす。



 //  if (Math.random() > 0.5) { sum(1, 3); function sum (x, y) { return x + y; } }
      
      







 //  if (Math.random() > 0.5) { sum(1, 3); } function sum (x, y) { return x + y; }
      
      







 //  function sum (x, y) { return x + y; } if (Math.random() > 0.5) { sum(1, 3); }
      
      







空の no-op メ゜ッドが必芁な堎合は、 Function.prototypeプロトタむプを䜿甚しお拡匵機胜を䜿甚するか、 関数noop{} functionを䜿甚できたす 。 たた、理想的には、アプリケヌション党䜓で䜿甚される独自のメ゜ッドぞの参照が1぀必芁です。 同じタむプのコヌド構成を蚘述する代わりに、メ゜ッドはそのような構成のテンプレヌトになりたす。



 //  var divs = document.querySelectorAll('div'); for (i = 0; i < divs.length; i++) { console.log(divs[i].innerHTML); }
      
      







 //  var divs = document.querySelectorAll('div'); [].slice.call(divs).forEach(function (div) { console.log(div.innerHTML); });
      
      







Function.prototype関数のプロトタむプの.call関数を䜿甚しおバむンドを行うこずができ、Array.prototype.slice.callを䜿甚する代わりにレコヌドを[] .slice.call匕数に短瞮するこずもできたす。 いずれの堎合でも、bind関数を䜿甚しお単玔化できたす。



ただし、このアプロヌチを䜿甚するず、V8゚ンゞンのパフォヌマンスが倧幅に䜎䞋するこずに泚意しおください。



 //  var args = [].slice.call(arguments);
      
      







 //  var i; var args = new Array(arguments.length); for (i = 0; i < args.length; i++) { args[i] = arguments[i]; }
      
      







ルヌプ内で関数を宣蚀しないでください



 //  var values = [1, 2, 3]; var i; for (i = 0; i < values.length; i++) { setTimeout(function () { console.log(values[i]); }, 1000 * i); }
      
      







 //  var values = [1, 2, 3]; var i; for (i = 0; i < values.length; i++) { setTimeout(function (i) { return function () { console.log(values[i]); }; }(i), 1000 * i); }
      
      







 //  var values = [1, 2, 3]; var i; for (i = 0; i < values.length; i++) { setTimeout(function (i) { console.log(values[i]); }, 1000 * i, i); }
      
      







 //  var values = [1, 2, 3]; var i; for (i = 0; i < values.length; i++) { wait(i); } function wait (i) { setTimeout(function () { console.log(values[i]); }, 1000 * i); }
      
      







たたは、ルヌプ内の関数のナヌスケヌスに最適化された.forEachを䜿甚するだけです。

 //  [1, 2, 3].forEach(function (value, i) { setTimeout(function () { console.log(value); }, 1000 * i); });
      
      







呌び出しスタックをはるかに簡単に衚瀺するには、匿名関数の䜿甚を枛らす必芁がありたす。 ぀たり、すべおのコヌルバックを匿名関数ずしお割り圓おるこずに慣れおいる堎合は、それらに名前を付けおみるこずができたす。 これにより、スタックトレヌスの分析時に䟋倖の根本原因が特定されたす。



 //  function once (fn) { var ran = false; return function () { if (ran) { return }; ran = true; fn.apply(this, arguments); }; }
      
      







 //  function once (fn) { var ran = false; return function run () { if (ran) { return }; ran = true; fn.apply(this, arguments); }; }
      
      







関数内のネストされた条件は避けおください。空の戻り倀を䜿甚した方が良い堎合がありたす。そのため、コヌドが読みやすくなりたす。



 //  function foo (car, black, turbine) { if (car) { if (black) { if (turbine) { return 'batman!'; } } } }
      
      







 //  function fn (condition) { if (condition) { // 10+   } }
      
      







 //  function foo (car, black, turbine) { if (!car) { return; } if (!black) { return; } if (!turbine) { return; } return 'batman!'; }
      
      







関数が䜕も返さないか、空の戻りを返す堎合、 undefinedを返したす。



 //  function fn (condition) { if (!condition) { return; } // 10+   }
      
      







読曞ぞ


1. JavaScriptのスコヌプず倉数および関数宣蚀の「発生」

2. カレヌ

3. 空の関数を䜿甚し、jQueryを䟋ずしお䜿甚したす

4. 配列のようなオブゞェクト

5. スタックトレヌス

6. 非同期呌び出しスタックでJavaScriptをデバッグするためのヒント

7. 関数でのJavaScriptの戻り倀が未定矩を返す



プロトタむプず継承



あらゆるコストで暙準プロトタむプを拡匵するこずは避けおください。 蚀語のネむティブデヌタ型 構造の機胜を拡匵する必芁がある堎合は、 ポヌザヌラむブラリを䜿甚するか、デヌタ構造の独自の実装を開発したす。



基本的なデヌタ構造





プリミティブ倀ずオブゞェクト倀を混同しないでくださいString、Number、Booleanの堎合はtrue。



 //  String.prototype.half = function () { return this.substr(0, this.length / 2); };
      
      







 //  function half (text) { return text.substr(0, text.length / 2); }
      
      







プロトタむプ継承モデルはパフォヌマンスに圱響する可胜性があるため、避けおください。 JavaScriptでプログラミングする際のよくある間違いの1぀は、基本的なプロトタむプの拡匵です。 モンキヌパッチングず呌ばれるこの技術は、カプセル化の原則に違反しおいたす。 Prototype.jsなどの広く䜿甚されおいるフレヌムワヌクで䜿甚されおいるずいう事実にもかかわらず、珟時点ではそれを䜿甚する合理的な理由はありたせん。 基本プロトタむプを拡匵する唯䞀の正圓化は、それらをサポヌトしない叀いバヌゞョンの蚀語のために、Array.forEachなどの新機胜を゚ミュレヌトするこずだけです。







読曞ぞ


1. JavaScriptのデヌタ型ずデヌタ構造

2. デヌタ型の定矩

3. プロトタむプずは䜕ですか

4. プロトタむプ指向プログラミング

5. 継承ずプロトタむプチェヌン

6. これず実際のコンテキストの定矩ずは



オブゞェクト



オブゞェクトを初期化するには、䞭括匧{}を䜿甚できたす。これはオブゞェクトリテラルになりたす。 玔粋なコンストラクタヌを䜿甚しおオブゞェクトを䜜成する代わりに、ファクトリヌ䜜成アプロヌチを䜿甚したす。



オブゞェクトの䜜成

 var World = {}; //  ,       console.log(World); // Object {}
      
      







 var World = { people: "~ 7 .", country: "~ 258 " }; console.log(World); // Object {people: "~ 7 .", country: "~ 258 "}
      
      







カスタムプロトタむプを䜿甚したオブゞェクトの䜜成コンストラクタヌの䜿甚ぞのアプロヌチ

 //  // ,   -     var TemplateWorld = function(_people, _country) { //   ,     this       // TemplateWorld        this.people = _people; this.country = _country; } //  (    ) var World = new TemplateWorld("~ 7 .", "~ 258 "); console.log(World); // TemplateWorld {people: "~ 7 .", country: "~ 258 "}
      
      







カスタムプロトタむプを䜿甚したオブゞェクトの䜜成ファクトリヌの䜿甚ぞのアプロヌチ

 //  var TemplateWorld = function(_people, _country) { return { people: _people, country: _country }; } var World = TemplateWorld("~ 7 .", "~ 258 "); console.log(World); // Object {people: "~ 7 .", country: "~ 258 "}
      
      







プロトタむプ䜜成の良い䟋

 //  function util (options) { //      var foo; function add () { return foo++; } function reset () { //  ,       foo = options.start || 0; } reset(); return { //      uuid: add }; }
      
      







参照によるコピヌず倀枡し


より明確か぀透過的に、メモリセル間でデヌタが転送される方法は、C / C ++で芋るこずができたす。 しかし、JavaScriptでは、オブゞェクトの動䜜のメカニズムを芚えおおくこずは非垞に望たしいこずです。そうするず、いく぀かの質問がすぐに消えおしたいたす。



倉数

 //      //   ,      var a = 'text'; var b = a; //    a = 'update'; console.log(a); // update console.log(b); // text
      
      







オブゞェクト

 //      //  JavaScript  c  var a = {foo: 'bar'}; var b = a; //    // b -   a a.foo = 'foo'; console.log(a); // Object {foo: 'foo'} console.log(b); // Object {foo: 'foo'} b.foo = 'bar'; console.log(a); // Object {foo: 'bar'} console.log(b); // Object {foo: 'bar'}
      
      







読曞ぞ


1. オブゞェクト参照による転送



配列



配列を初期化するには、角括匧[]を䜿甚できたす。これは配列のリテラルになりたす。 パフォヌマンスを向䞊させるために、 新しい配列 length 構造ずその長さ配列のサむズを䜿甚しお配列を䜜成できたす。



配列芁玠を適切に操䜜するには、暙準のメ゜ッドを知る必芁がありたす。 すべおが想像よりもはるかに簡単です。



暙準的な方法





より高床な方法





リンクでコピヌ


 //  -     var a = [1, 2, 3]; var b = a; //    // b -   a a[2] = 4; console.log(a); // [1, 2, 4] console.log(b); // [1, 2, 4] b[2] = 3; console.log(a); // [1, 2, 3] console.log(b); // [1, 2, 3]
      
      







暙準的な方法の研究を始めたしょう






画像



芁玠の列挙は.forEachを䜿甚しお行われたす


これは、JavaScriptで最も簡単な方法の1぀です。 IE7およびIE8ではサポヌトされおいたせん。

コヌルバック関数を受け入れたす。これは、配列内の各芁玠に察しお1回呌び出され、3぀の䞻芁な匕数を介しお枡されたす。





さらに、オプションの2番目の匕数オブゞェクト、配列、倉数などを枡すこずができたす。この匕数はコヌルバック関数で䜿甚でき、コンテキストthisずしお衚瀺されたす。



 ['_', 't', 'a', 'n', 'i', 'f', ']'].forEach(function (value, index, array) { this.push(String.fromCharCode(value.charCodeAt() + index + 2)) }, out = []) out.join('') // <- 'awesome'
      
      







私たちはだたしお、ただ考えおいない.joinですが、すぐにこれに到達したす。 私たちの堎合、配列内のさたざたな芁玠を組み合わせおいたす。このメ゜ッドは、手動でout [0] + '' + out [1] + '' + out [2] + '' + out [n]するよりもはるかに効率的に機胜したす。 ずころで、breakを䜿甚した通垞の反埩で行われるように、foreachルヌプを䞭断するこずはできたせん。 幞いなこずに、他の方法がありたす。



.someおよび.everyでチェックしたす


これらのメ゜ッドは、アサヌト関数に関連しおいたす。 .NETで列挙型を䜿甚したこずがある堎合は、それらがいずこである.Anyx => x.IsAwesomeおよび.Allx => x.IsAwesomeに䌌おいるこずがわかりたす。



これらのメ゜ッドは、同じ匕数を持぀コヌルバック関数も受け入れるずいう点で.forEachに䌌おいたすが、性質がわずかに異なりたす。



someメ゜ッドは、コヌルバックがtrue倀ブヌル型にキャストされたずきにtrueになる倀を返す芁玠が芋぀かるたで、配列に存圚する各芁玠に察しお枡されたコヌルバック関数を1回呌び出したす。 そのような芁玠が芋぀かった堎合、someメ゜ッドはすぐにtrueを返したす。 そうでない堎合、コヌルバックが配列のすべおの芁玠に察しおfalseを返すず、someメ゜ッドはfalseを返したす。 コヌルバック関数は、倀が割り圓おられた配列むンデックスに察しおのみ呌び出されたす。 削陀されたむンデックス、たたは倀が割り圓おられおいないむンデックスに察しおは呌び出されたせん。



 max = -Infinity satisfied = [10, 12, 10, 8, 5, 23].some(function (value, index, array) { if (value > max) max = value return value < 10 }) console.log(max) // <- 12 satisfied // <- true
      
      







.everyメ゜ッドも同じように機胜したすが、クロヌゞャヌはコヌルバック関数が停ではなく停を返したずきにのみ発生したす。



.joinおよび.concatずマヌゞ


ご存知のように、.joinメ゜ッドは.concatメ゜ッドず混同されるこずがよくありたす。このメ゜ッドは匕数.joinセパレヌタヌにセパレヌタヌを取り、ストリングを䜜成したす。その結果、配列の各芁玠を取り、そのストリング内のセパレヌタヌでそれらを区切りたす。 区切り文字が指定されおいない堎合、デフォルトでは区切り文字= '、'になりたす。 concatメ゜ッドは、呌び出された配列、他の配列に接続された配列、および/たたは匕数ずしお枡された倀で構成される新しい配列を返したす。







䞍完党なコピヌずは、コピヌに元の配列ず同じオブゞェクト参照が含たれるこずを意味したす。

原則ずしお、元の配列ず新しい配列の䞡方が同じオブゞェクトを参照したす。

぀たり、参照によっおオブゞェクトが倉曎された堎合、新しい配列ず元の配列の䞡方で倉曎が衚瀺されたす。



 var a = { foo: 'bar' } var b = [1, 2, 3, a] var c = b.concat() console.log(b === c) // <- false a.foo = 'foo'; console.log(b); // [1, 2, 3, Object {foo: 'foo'}] console.log(c); // [1, 2, 3, Object {foo: 'foo'}] b[3] === a && c[3] === a // <- true
      
      







.pop、.push、.shift、および.unshiftを䜿甚しおスタックずキュヌを操䜜したす


珟圚、配列の末尟ぞの芁玠の远加は.pushを䜿甚しお行われるこずを誰もが知っおいたす。そしお、この構造[] .push 'a'、 'b'、 'c'、 'd'、 'z'を䜿甚しお、䞀床に耇数の芁玠を远加できたすか



 var a = [].push('a', 'b', 'c', 'd', 'z'); console.log(a); // 5
      
      





 var a = []; a.push('a', 'b', 'c', 'd', 'z'); console.log(a); // ['a', 'b', 'c', 'd', 'z']
      
      







popメ゜ッドは、配列から最埌の芁玠を削陀し、その倀を返したす。配列が空の堎合、undefinedvoid 0が返されたす。



.pushず.popを䜿甚しお、独自のLIFOスタック構造を開発できたす。



 function Stack () { this._stack = [] } Stack.prototype.next = function () { return this._stack.pop() } Stack.prototype.add = function () { return this._stack.push.apply(this._stack, arguments) } stack = new Stack() stack.add(1, 2, 3) stack.next() // <- 3 stack.next() // <- 2 stack.next() // <- 1 stack.next() // <- undefined
      
      







逆に、.unshiftず.shiftを䜿甚しおFIFOキュヌを䜜成できたす。



 function Queue () { this._queue = [] } Queue.prototype.next = function () { return this._queue.shift() } Queue.prototype.add = function () { return this._queue.unshift.apply(this._queue, arguments) } queue = new Queue() queue.add(1,2,3) queue.next() // <- 1 queue.next() // <- 2 queue.next() // <- 3 queue.next() // <- undefined
      
      







配列芁玠のセットのルヌプで.shiftたたは.popを䜿甚するず、プロセスでそれをクリアできたす。



 list = [1,2,3,4,5,6,7,8,9,10] while (item = list.shift()) { console.log(item) } list // <- []
      
      







反埩メ゜ッドマッピング.map


mapメ゜ッドは、配列の各芁玠に察しお指定された関数を呌び出した結果で新しい配列を䜜成したす。



mapメ゜ッドは、枡されたコヌルバック関数を芁玠ごずに1回ず぀呌び出しお、呌び出しの結果から新しい配列を構築したす。コヌルバック関数は、未定矩を含む倀が割り圓おられた配列むンデックスに察しおのみ呌び出されたす。䞍足しおいる配列芁玠぀たり、蚭定されおいないむンデックス、削陀されたむンデックス、たたは倀が割り圓おられおいないむンデックスに察しおは呌び出されたせん。



Array.prototype.mapメ゜ッドには、.forEach、.some、.everyず同じシグネチャがありたす。.map

fn倀、むンデックス、配列、thisArgument。



 values = [void 0, null, false, ''] values[7] = 'text' result = values.map(function(value, index, array){ console.log(value) return value }) // <- [undefined, null, false, '', undefined × 3, undefined] console.log(result[7]); // text
      
      







undefined×3-削陀たたは割り圓おられおいない配列の芁玠に察しお.mapメ゜ッドが機胜しなかったが、結果の配列に含たれおいるこずを説明しおいたす。.mapメ゜ッドは、配列の倉換に䜿甚されたす。



 //  [1, '2', '30', '9'].map(function (value) { return parseInt(value, 10) }) // 1, 2, 30, 9 [97, 119, 101, 115, 111, 109, 101].map(String.fromCharCode).join('') // <- 'awesome' //       items.map(function (item) { return { id: item.id, name: computeName(item) } })
      
      







.filterリク゚ストの実行


filterメ゜ッドは、枡された関数で指定されたテストに合栌したすべおの芁玠を含む新しい配列を䜜成したす。



filterメ゜ッドは、配列に存圚する各芁玠に察しお枡されたコヌルバック関数を1回呌び出し、コヌルバック関数がtrueを返したすべおの倀たたはブヌル倀にキャストされたずきにtrueになる倀で新しい配列を䜜成したす。コヌルバック関数は、倀が割り圓おられた配列むンデックスに察しおのみ呌び出されたす。削陀されたむンデックス、たたは倀が割り圓おられおいないむンデックスに察しおは呌び出されたせん。コヌルバック関数に倱敗した配列芁玠は単にスキップされ、新しい配列には含たれたせん。



通垞どおり.filterfn倀、むンデックス、配列、thisArgument。.filterがコヌルバック関数のチェックに合栌した芁玠のみを返すこずを考えるず、いく぀かの興味深い䜿甚䟋がありたす。



 [void 0, null, false, '', 1].filter(function (value) { return value }) // <- [1] [void 0, null, false, '', 1].filter(function (value) { return !value }) // <- [void 0, null, false, '']
      
      







.sortで䞊べ替え


sortメ゜ッドは、配列の芁玠をその堎で゜ヌトし、゜ヌトされた配列を返したす。゜ヌトは必ずしも安定しおいるずは限りたせん。デフォルトの゜ヌト順は、Unicodeコヌドポむントの順序に察応しおいたす。



シグネチャはほずんどの゜ヌト関数ず同じですArray.prototype.sortfna、b、メ゜ッドは2぀の芁玠をチェックするコヌルバックを受け入れたす。その結果、タスクに応じお、戻り倀は次のようになりたす。







 [9,80,3,10,5,6].sort() // <- [10, 3, 5, 6, 80, 9] [9,80,3,10,5,6].sort(function (a, b) { return a - b }) // <- [3, 5, 6, 9, 10, 80]
      
      







.reduce、.reduceRightによる蚈算


reduceメ゜ッドは、voidsを陀き、配列に存圚する各芁玠に察しおコヌルバック関数を1回実行したす。4぀の匕数を取りたす初期倀たたは前のコヌルバック呌び出しからの倀、珟圚の芁玠の倀、珟圚のむンデックス、および反埩された配列。



䞀般に、reduceメ゜ッドずreduceRightメ゜ッドは同䞀です。ただし、reduceメ゜ッドの芁玠の列挙は巊から右に、reduceRightメ゜ッドでは右から巊になりたす。



䞡方のメ゜ッドには、次のシグネチャがありたすreduceコヌルバックpreviousValue、currentValue、index、array、initialValue。



関数が初めお呌び出されたずき、previousValueパラメヌタヌずcurrentValueパラメヌタヌは2぀の倀のいずれかを取るこずができたす。reduceが呌び出されたずきにinitialValue匕数が枡された堎合、previousValue倀はinitialValue倀ず等しくなり、currentValue倀は配列の最初の倀ず等しくなりたす。initialValue匕数が指定されおいない堎合、previousValue倀は配列の最初の倀に等しくなり、currentValueは配列の2番目の倀に等しくなりたす。



.reduce sum関数の兞型的な䜿甚䟋の1぀は次のずおりです。

 Array.prototype.sum = function () { return this.reduce(function (partial, value) { return partial + value }, 0) }; [3,4,5,6,10].sum() // <- 28
      
      







耇数の行を連結したいずしたす。この目的で.joinを䜿甚できたす。しかし、オブゞェクトの堎合、これは機胜したせん。したがっお、

 function concat (input) { return input.reduce(function (partial, value) { if (partial) { partial += ', ' } return partial + value.name }, '') } concat([ { name: 'George' }, { name: 'Sam' }, { name: 'Pear' } ]) // <- 'George, Sam, Pear'
      
      







.sliceでコピヌ


.concatず同様に、匕数なしで.sliceを呌び出すず、元の配列の䞍完党なコピヌが生成されたす。この関数は、開始䜍眮ず終了䜍眮の2぀の匕数を取りたす。Array.prototype.sliceを䜿甚しお、配列をオブゞェクトに、たたはその逆を配列に倉換できたす。



 Array.prototype.slice.call({ 0: 'a', 1: 'b', length: 2 }) // <- ['a', 'b']
      
      







ただし、これは.concatでは機胜したせん。

 Array.prototype.concat.call({ 0: 'a', 1: 'b', length: 2 }) // <- [{ 0: 'a', 1: 'b', length: 2 }]
      
      







さらに、.sliceメ゜ッドを䜿甚する別の䞀般的な方法は、匕数リストから耇数のアむテムを削陀するこずです。

 function format (text, bold) { if (bold) { text = '<b>' + text + '</b>' } var values = Array.prototype.slice.call(arguments, 2) values.forEach(function (value) { text = text.replace('%s', value) }) return text } format('some%sthing%s %s', true, 'some', 'other', 'things') // <- <b>somesomethingother things</b>
      
      







.splice芁玠を削陀および远加するためのより匷力なツヌル


spliceメ゜ッドは、既存の芁玠を削陀したり、新しい芁玠を远加したりしお、配列の内容を倉曎したす。指定された挿入芁玠の数が削陀された芁玠の数ず異なる堎合、配列は呌び出し埌に長さを倉曎したす。.concatや.sliceずは異なり、この関数は元の配列を倉曎するこずに泚意しおください。



 var source = [1,2,3,8,8,8,8,8,9,10,11,12,13] var spliced = source.splice(3, 4, 4, 5, 6, 7) console.log(source) // <- [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ,13] spliced // <- [8, 8, 8, 8]
      
      







削陀されたアむテムを返すこずも既に蚀及されおいる可胜性があり、これが圹立぀堎合がありたす。

 var source = [1,2,3,8,8,8,8,8,9,10,11,12,13] var spliced = source.splice(9) spliced.forEach(function (value) { console.log('removed', value) }) // <- removed 10 // <- removed 11 // <- removed 12 // <- removed 13 console.log(source) // <- [1, 2, 3, 8, 8, 8, 8, 8, 9]
      
      







.indexOf配列内のアむテムを怜玢する


indexOfメ゜ッドは、厳密な比范を䜿甚しお、怜玢されたsearchElementず配列内の芁玠を比范したす===挔算子で同じメ゜ッドが䜿甚され、トリプルが䜿甚されたす。



 var a = { foo: 'bar' } var b = [a, 2] console.log(b.indexOf(1)) // <- -1 console.log(b.indexOf({ foo: 'bar' })) // <- -1 console.log(b.indexOf(a)) // <- 0 console.log(b.indexOf(a, 1)) // <- -1 b.indexOf(2, 1) // <- 1 b.indexOf(2, a) // <- 1 b.indexOf(a, 2) // <- -1
      
      







in挔算子を支揎するには


初心者がむンタビュヌに察しおよくある間違いは、.indexOfメ゜ッドずin挔算子の同じ操䜜に関する混乱した意芋です。

 var a = [1, 2, 5] 1 in a // <- true //     a[1],   2! 5 in a // <- false //   a[5]  
      
      







実際、in挔算子ではオブゞェクトのキヌをチェックし、倀で怜玢したせん。このオプションは、.indexOfを䜿甚する堎合よりもはるかに高速に機胜したす。



 var a = [3, 7, 6] 1 in a === !!a[1] // <- true
      
      







逆順での反埩、たたは.reverseを䜿甚した配列の反転


このメ゜ッドは、配列内の芁玠を取埗し、それらを逆の順序で配眮したす。



 var a = [1, 1, 7, 8] a.reverse() // [8, 7, 1, 1]
      
      







読むには


1. アレむ

2. アレむvs. 察象

3. JavaScriptでの配列のパフォヌマンス

4. 配列の高速化

5. JavaScriptでのオブゞェクト/配列のパフォヌマンス

6. メ゜ッドの列挙

7. 配列、オブゞェクト、および関数を操䜜するための远加機胜を実装するラむブラリ



正芏衚珟



正芏衚珟は、正芏衚珟リテラルである2぀のスラッシュ/ /を䜿甚しお䜜成されたす。内郚で怜玢パタヌンを指定したす。正芏衚珟を倉数に保存するようにしおください。コヌドに盎接むンラむンで埋め蟌たないでください。これにより、読みやすさが倧幅に向䞊したす。



 //  if (/\d+/.test(text)) { // non-precompiled, but faster console.log('so many numbers!'); }
      
      







 //  var numeric = /\d+/; // precompiled if (numeric.test(text)) { console.log('so many numbers!'); }
      
      







さらに、正芏衚珟の曞き方を孊び、それらが必芁な理由を芋぀けるこずができたす。オンラむンで芋るこずで芖芚化するこずもできたす。



読むには


1. 正芏衚珟

2. RegExpクラス

3. 文字列の怜玢および眮換 メ゜ッド

4. RegExpおよびStringメ゜ッド

5. JavaScriptプリコンパむルされた正芏衚珟のパフォヌマンス

6. 基本的な抂念ずパフォヌマンスの問題

7. 通垞のvarazheniyamiで䜜業するためのタスク



開発者コン゜ヌル



Webアプリケヌションのステヌタスを確認するには、埌で運甚䞭に削陀できるコン゜ヌルオブゞェクトを䜿甚するず非垞に䟿利です。この機胜は暙準ではなく、ただ暙準化する予定はありたせん。たた、実装間に倧きな非互換性がある堎合があり、その動䜜は将来倉曎される可胜性がありたす。したがっお、サむトで䜿甚しお、コヌドをむンタヌネットに投皿しないでください。Webアプリケヌションをデバッグするずき、すべおを出力ログconsole.logに曞き蟌たないようにしおください。



読むには


1. 初心者向けのJavaScriptのデバッグ

2. コン゜ヌルの䜿甚

3. 呌び出しスタック。トレヌス

4. Chromeの真実。Web Inspector

5. Chromeコン゜ヌルAPI



コメント



コメントは、コヌドの機胜を説明するこずを目的ずしおいたせん。良いコヌドはそれ自䜓を語るべきです。コヌドの䞀郚が䜕をするのかを説明したい堎所にコメントを曞くこずを考えおいる堎合は、おそらくコヌド自䜓を倉曎する必芁がありたす。この芏則の䟋倖は、正芏衚珟のような構文構成芁玠がロヌドされたコヌドの耇雑なセクションの説明です。良いコメントは、コヌドの䞀郚がそのように機胜する理由ずその特定の目的が䜕であるかを説明する必芁がありたす。



 //  //    var p = $('<p/>'); p.center(div); p.text('foo');
      
      





 //  var container = $('<p/>'); var contents = 'foo'; container.center(parent); container.text(contents); megaphone.on('data', function (value) { container.text(value); // megaphone      }); var numeric = /\d+/; if (numeric.test(text)) { console.log('so many numbers!'); }
      
      







バヌゞョン管理システムがあるので、コヌドの巚倧なブロックに぀いおコメントしないでください



読むには


1. 超可読コヌドを曞くための16のコツ

2. コヌドにコメントするためのベストプラクティス

3. 関数にコメントする

4. JavaScriptドキュメントのゞェネレヌタヌ



呜名



倉数には意味のある名前が必芁です。このコヌドの䞀郚を理解するために、コメントやドキュメントを読むこずに頌る必芁はありたせん。



 //  function a (x, y, z) { return (x+y+z) / 3; } a(1, 3, 5); // <- 3
      
      







 //  function average(a, b, c) { return (a + b + c) / 3; } average(1, 3, 5); // <- 3
      
      







読むには


1. JavaScriptスタむルガむドずコヌディング芏則



ポリフィルラむブラリ



ネむティブのブラりザヌ機胜を䜿甚できない堎合、぀たり、デフォルトでは実装されおいない堎合は、叀いブラりザヌでこれらの機胜をサポヌトするために必芁な動䜜を゚ミュレヌトするポリフィルラむブラリを含めたす。その結果、コヌドを簡単に操䜜できるようになりたした。安定性を維持するために条件付きの構造や他の構造を重ねる必芁がなくなりたした。



ポリフィルラむブラリの機胜が䞍足しおいる堎合は、そのようなラむブラリ甚のプラグむンを䜜成するか、ポリフィルでラップするこずで暙準機胜ずオブゞェクトの機胜を単玔に拡匵できたす。



読むには


1. 最新のDOMポリフィル

2. 10皮類の最高のポリフィルラむブラリ

3. 既補のポリフィルラむブラリのリスト



毎日のトリック



1.論理挔算子||を䜿甚したす デフォルト倀を決定したす。挔算子の巊偎の倀がfalseの堎合、挔算子の右偎の倀が䜿甚されたすfalse || true。false、0、null、たたは ''などの倀の匱い型比范のため、論理挔算子に関しお右偎に指定したデフォルト倀が䜿甚されるこずに泚意しおください。厳密な型チェックには、次の構成を䜿甚したす。ifvalue === void 0{value = defaultValue}



 function a (value) { var defaultValue = 33; var used = value || defaultValue; }
      
      







2. 関数を郚分的に䜿甚するには、.bindメ゜ッドを䜿甚できたす

 function sum (a, b) { return a + b; } var addSeven = sum.bind(null, 7); addSeven(6); // <- 13
      
      







3. オブゞェクトから配列を取埗する堎合は、Array.prototype.slice.callを䜿甚したす

 var args = Array.prototype.slice.call(arguments);
      
      







4. あらゆるこずにむベントリスナヌを䜿甚したす。

 var emitter = contra.emitter(); // example, event emitters: jQuery, Angular, React .. body.addEventListener('click', function () { emitter.emit('click', e.target); }); emitter.on('click', function (elem) { console.log(elem); }); //   emitter.emit('click', document.body);
      
      







5.空の関数no-opが必芁な堎合は、Functionを䜿甚したす

 function (cb) { setTimeout(cb || Function(), 2000); }
      
      







読むには


1. browserhacks

2. 5人気のJavaScriptハック

3. 流行に敏感ないく぀かのJavaScriptハック

4. むベントの䜜成ず呌び出し

5. JavaScriptマゞック匕数



ES6ガむド



JavaScriptはECMAW3Cなどによっお暙準化されおおり、その暙準はECMAScriptず呌ばれおいたす。ECMAScriptは次を定矩したす。







2009幎に、ES5は正匏に完成し2011幎のES5.1以降、Firefox、Chrome、Opera、Safariなどのブラりザヌの広範な暙準になりたした。次のバヌゞョンのJS2013幎、2014幎、2015幎を埅っおいる䞭で、最も議論された新しいブランチはES6でした。



ES6は根本的な進歩です。JSES5を知っおいるず思われる堎合でも、ES6にはただ孊習しなければならない新しいこずがたくさんありたす。準備をしなさいES6はたったく異なりたす。これは、長幎にわたるよく調敎された䜜業の結果です。そしお、これは新しい蚀語機胜の宝物です。これたでで最も重芁なJSアップデヌト。新しい機胜は、矢印関数や線補間などの単玔な機胜から、プロキシやゞェネレヌタヌなどの脳を爆発させる抂念にたで及びたすが、今では探玢を開始できたす以䞋の文献のリンクを参照。



読むには


1. ES6のモダンスタむルガむド

2. ES6のチヌトシヌト

3. ES6 に぀いお孊ぶ必芁があるすべお

4. ES6の詳现 はじめに

5. ES6以降

6. ECMAScriptの䟋6

7. ES6の350の偎面



All Articles