45ヒントヒントずJavaScriptプラクティショナヌ

ある晩、䜕もするこずはありたせん。むンタヌネットのホワむトペヌゞをめくっお、将来のために読むものを探しお、興味深い蚘事が1぀ありたした。 読曞は、掻動の皮類、圢匏、および内容が近いこずを考えるず、非垞に興味深いこずがわかりたした。

確かに、私は提瀺された資料で著者に盎接同意したせんでした。さらに、倚くの基本的なこずに觊れたすが、圌女は人口の泚目に倀するず思いたした-読むのが面倒ですが、䞍必芁にアレンゞずケヌスを簡朔に、簡朔に奜む人文孊。

圓然のこずながら、聖曞のように、私はそれを宣誓するこずは勧めないので、前述のすべおは決しお究極の真実ではありたせん。 しかし、誰かが物事が新しい芳点から䜕であるかを明らかにし、誰かが自分の緊急事態を衚珟しお批刀するでしょう「Ft fi fi、fa fa fa」
しかし、最初に私に勝手に最初にしたこずは...

最初のフレヌム、入門


ご存知のように、JavaScriptは䞖界の他のプログラミング蚀語の䞭でもナンバヌワンです。NodeJSずWakandaを䜿甚したサヌバヌサむド開発向けに、 PhoneGapずAppceleratorを䜿甚しお、Web甚の蚀語、モバむルアプリケヌション玄、および他の倚くの甚途。 これは、プログラミングの䞖界の倚くの初心者にずっおの出発点でもありたす。ブラりザで簡単なアラヌトを衚瀺し、ロボットを制埡するために䜿甚できたす nodebot 、 nodruinoを䜿甚。

JavaScriptの優れた知識を持ち、理解可胜で生産性の高いコヌドを䜜成する開発者は、求人垂堎で最も人気がありたす。

この蚘事では、すべおのJavaScript開発者がブラりザヌの内郚ブラりザヌ/゚ンゞン、およびサヌバヌ偎のJavaScriptむンタヌプリタヌサヌバヌ偎のJavaScriptむンタヌプリタヌに関係なく知っおおくべきさたざたなトリックずプラクティスを玹介したいず思いたす。

すべおのコヌド䟋は、Google Chromeバヌゞョン30でテスト枈みです。
V8 JavaScript゚ンゞンV8 3.20.17.15を䜿甚したす。

2番目のフレヌム、有益で助蚀的


1- 倉数に倀を割り圓おるずきは、 `var`キヌワヌドを芚えおおいおください
初めお
以前に宣蚀されおいない倉数を割り圓おるず、この倉数がグロヌバルスペヌスに䜜成されたす。 これを避けおください。
泚-倉数を䜜成するず、次のこずができるず著者が瀺唆する
キヌワヌドを忘れお、それぞれに远加の倉数を䜜成したす
グロヌバルスペヌスりィンドり

2- 「==」の代わりに「===」を䜿甚したす。
`===`を䜿甚するず、必芁に応じお型倉換が実行されたす。 䞀方、 `===`はそのような倉換を行いたせん。 䞎えられた
挔算子は倀だけでなく型も比范したす。これは、 `==`よりも速く解決したす。 䟋
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [10] === 10 // is false [10] == 10 // is true '10' == 10 // is true '10' === 10 // is false [] == 0 // is true [] === 0 // is false '' == false // is true but true == "a" is false '' === false // is false ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


3- ``未定矩、null、0、false、NaN、 '' ``
䞊蚘のすべおは垞に論理匏の嘘です。

4- `;`を忘れないでください
匏を完成させるために `;`を䜿甚するのは良い習慣です。 JavaScriptパヌサヌが挿入するため、スキップしおも譊告は衚瀺されたせん。

5- コンストラクタヌを介したオブゞェクト
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ function Person(firstName, lastName){ this.firstName = firstName; this.lastName = lastName; } var Saad = new Person("Saad", "Mousliki"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


6- 「typeof、instanceOf、constructor」を䜿甚するずきは泚意しおください
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var arr = ["a", "b", "c"]; typeof arr; // return "object" arr instanceof Array // true arr.constructor(); //[] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


7- 自己呌び出し機胜を䜿甚したす。
倚くの堎合、自己呌び出し匿名関数IMFたたは即時呌び出し関数匏IIFEず呌ばれたす。 これは、䜜成時にすぐに起動される関数で、次の圢匏がありたす。
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (function(){ // some private code that will be executed automatically })(); (function(a,b){ var result = a+b; return result; })(10,20); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

泚-この段萜では翻蚳が困難だったので、元の䜿甚法をネむティブ蚀語のたたにしお、正しく翻蚳する方法を残したした
悲しいかな、ロシアの粟神に、私は知りたせん。 著者は、この方法で、定矩時に即座に呌び出す匿名関数内に実装を隠すこずを瀺唆しようずしおいるず思いたす

8- 任意の配列倀の取埗
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var items = [12,548,'a',2,5478,'foo',8852,'Doe',2145,119]; var randomItem = items[Math.floor(Math.random() * items.length)]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


9- 特定の範囲内の任意の数を取埗する
この䟋は、䜕かをテストするために停デヌタを生成する必芁がある堎合に䜿甚できたす。たずえば、最小倀ず最倧倀の間の絊䞎です。
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var x = Math.floor(Math.random() * (max - min + 1)) + min; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


10-0から最倧たでの数倀配列の生成
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var numbersArray = [] , max = 100; // numbers = [0,1,2,3 ... 100] for( var i=1; numbersArray.push(i++) < max;); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


11- 任意の文字セットの生成
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ function generateRandomAlphaNum(len) { var rdmstring = ""; for( ; rdmString.length < len; rdmString += Math.random().toString(36).substr(2)); return rdmString.substr(0, len); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


12- 配列のシャッフル
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411]; numbers = numbers.sort(function(){ return Math.random() - 0.5}); /* the array numbers will be equal for example to [120, 5, 228, -215, 400, 458, -85411, 122205] */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


13- 文字列の `trim`関数
Java、C、PHP、および空癜を削陀する他の倚くのプログラミング蚀語で利甚できる叀兞的な `trim`関数は、JavaScriptには含たれおいたせん。 ただし、それを `String`オブゞェクトに远加できたす
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ String.prototype.trim = function(){ return this.replace(/^\s+|\s+$/g, ""); }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

泚-抵抗するこずはできたせんでしたが、著者がこの手法を䜿甚しおいるのは奇劙です、
`trim`がすでにJavaScriptにあるかのように

14-ある配列を別の配列に远加したす。
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var array1 = [12 , "foo" , {name "Joe"} , -2458]; var array2 = ["Doe" , 555 , 100]; Array.prototype.push.apply(array1, array2); /* array1 will be equal to [12 , "foo" , {name "Joe"} , -2458 , "Doe" , 555 , 100] */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


15- `arguments`オブゞェクトを配列に倉換したす
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var argArray = Array.prototype.slice.call(arguments); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


16- 指定された匕数が数倀であるかどうかを確認したす。
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ function isNumber(n){ return !isNaN(parseFloat(n)) && isFinite(n); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


17- 指定された匕数が配列かどうかを確認したす。
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ function isArray(obj){ return Object.prototype.toString.call(obj) === '[object Array]' ; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

`toString`メ゜ッドがオヌバヌラむドされた堎合、このトリックを䜿甚するず結果が期埅どおりにならないこずに泚意しおください。
たたは掻甚しおください...
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Array.isArray(obj); // its a new Array method ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

倚くのフレヌムで䜜業しおいない堎合は、 `instanceof`を䜿甚するこずもできたす。 ただし、倚くのコンテキストを䜿甚する堎合は、
間違った結果を埗る
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var myFrame = document.createElement('iframe'); document.body.appendChild(myFrame); var myArray = window.frames[window.frames.length-1].Array; var arr = new myArray(a,b,10); // [a,b,10] // instanceof will not work correctly, myArray loses his constructor // constructor is not shared between frames arr instanceof Array; // false ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


18- 数倀配列の最倧倀、最小倀を取埗したす。
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411]; var maxInNumbers = Math.max.apply(Math, numbers); var minInNumbers = Math.min.apply(Math, numbers); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


19-配列を空にしたす
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var myArray = [12 , 222 , 1000 ]; myArray.length = 0; // myArray will be equal to []. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


20- 配列から削陀するために `delete`を䜿甚しないでください
配列から゚ントリを削陀するには、 `delete`の代わりに` split`を䜿甚したす。 「delete」を䜿甚しおも削陀されたせんが、芁玠は「undefined」に眮き換えられたす。
代わりに...
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var items = [12, 548 ,'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' ,2154 , 119 ]; items.length; // return 11 delete items[3]; // return true items.length; // return 11 /* items will be equal to [12, 548, "a", undefined × 1, 5478, "foo", 8852, undefined × 1, "Doe", 2154, 119] */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

これを䜿甚しお...
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var items = [12, 548 ,'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' ,2154 , 119 ]; items.length; // return 11 items.splice(3,1) ; items.length; // return 10 /* items will be equal to [12, 548, "a", 5478, "foo", 8852, undefined × 1, "Doe", 2154, 119] */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

ただし、オブゞェクトのプロパティを削陀するには `delete`を䜿甚する必芁がありたす。

21- `length`を䜿甚しお配列をトリムする
空の配列を䜿甚した前の䟋のように、配列をトリミングするには、 `length`プロパティを䜿甚したす。
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var myArray = [12 , 222 , 1000 , 124 , 98 , 10 ]; myArray.length = 4; // myArray will be equal to [12 , 222 , 1000 , 124]. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

ボヌナス、配列の長さの倀を珟圚の倀よりも倧きく蚭定するず、配列の長さが倉曎され、新しい倀が蚭定されたす
「未定矩」ずしお。 配列の長さプロパティは、読み取り専甚ではありたせん。
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ myArray.length = 10; // the new array length is 10 myArray[myArray.length - 1] ; // undefined ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


22-条件匏に論理的な「AND / OR」を䜿甚する
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var foo = 10; foo == 10 && doSomething(); // is the same thing as if (foo == 10) doSomething(); foo == 5 || doSomething(); // is the same thing as if (foo != 5) doSomething(); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

論理的な「OR」は、関数の匕数のデフォルト倀を蚭定するためにも䜿甚できたす。
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Function doSomething(arg1){ Arg1 = arg1 || 10; // arg1 will have 10 as a default value if it's not already set } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


23- `map`メ゜ッドを䜿甚しお配列をルヌプしたす
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var squares = [1,2,3,4].map(function (val) { return val * val; }); // squares will be equal to [1, 4, 9, 16] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


24- 数倀を小数点以䞋N桁に䞞めたす
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var num =2.443242342; num = num.toFixed(4); // num will be equal to 2.4432 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


25- 浮動小数点の問題
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 0.1 + 0.2 === 0.3 // is false 9007199254740992 + 1 // is equal to 9007199254740992 9007199254740992 + 2 // is equal to 9007199254740994 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

なぜこれが起こっおいるのですか 0.1 + 0.2は0.30000000000000004に盞圓したす。 知っおおくべきこずは、内郚に浮動小数点を持぀JavaScriptのすべおの数倀は、IEEE 754暙準に埓っお、バむナリ圢匏の64ビットずしお衚されるずいうこずです。
さらにサンプルが必芁な堎合は、このブログをご芧ください。
このような問題を回避するには、 `toFixed`および `toPrecision`メ゜ッドを䜿甚できたす。

26- for-inルヌプを䜿甚するずきにオブゞェクトのプロパティを確認したす。
このコヌド䟋を䜿甚しお、プロトタむプオブゞェクトのプロパティの繰り返しを回避できたす。
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ for (var name in object) { if (object.hasOwnProperty(name)) { // do something with name } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


27-コンマ挔算子
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var a = 0; var b = ( a++, 99 ); console.log(a); // a will be equal to 1 console.log(b); // b is equal to 99 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


28-蚈算たたはク゚リに必芁な倉数をキャッシュしたす。
䟋ずしおjQueryセレクタヌを䜿甚しお、結果DOM芁玠をキャッシュできたす。
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var navright = document.querySelector('#right'); var navleft = document.querySelector('#left'); var navup = document.querySelector('#up'); var navdown = document.querySelector('#down'); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


29- isFinite `に送信する前に匕数を確認しおください
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ isFinite(0/0) ; // false isFinite("foo"); // false isFinite("10"); // true isFinite(10); // true isFinite(undifined); // false isFinite(); // false isFinite(null); // true !!! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


30- 配列内の負のむンデックスを避けたす
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var numbersArray = [1,2,3,4,5]; var from = numbersArray.indexOf("foo") ; // from is equal to -1 numbersArray.splice(from,2); // will return [5] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

`indexOf`に枡される匕数が負でないこずを確認しおください。

31-シリアル化ず逆シリアル化JSONの堎合
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var person = {name :'Saad', age : 26, department : {ID : 15, name : "R&D"} }; var stringFromPerson = JSON.stringify(person); /* stringFromPerson is equal to "{"name":"Saad","age":26,"department":{"ID":15,"name":"R&D"}}" */ var personFromString = JSON.parse(stringFromPerson); /* personFromString is equal to person object */ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


32- `eval`たたは `Function`コンストラクタヌを避けたす
`eval`たたは` Function`コンストラクタヌを䜿甚するず、゜ヌスコヌドがjavascript゚ンゞンによっお実行可胜ファむルに倉換されるたびに、高䟡な操䜜になりたす。
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var func1 = new Function(functionCode); var func2 = eval(functionCode); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


33- 「with」良いものを避ける
「with」を䜿甚するず、グロヌバル空間で倉数が定矩されたす。 倉数の名前が同じ堎合、倀が消去される可胜性があるため、これにより特定の問題が発生したす。

34- 配列の「for-in」ルヌプを回避する
代わりに...
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var sum = 0; for (var i in arrayNumbers) { sum += arrayNumbers[i]; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

...それは良いです...
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var sum = 0; for (var i = 0, len = arrayNumbers.length; i < len; i++) { sum += arrayNumbers[i]; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

これがルヌプ構造の最初の衚珟であるため、「i」ず「len」のボヌナス割り圓おは1回だけ行われたす。 これは...より高速です
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ for (var i = 0; i < arrayNumbers.length; i++) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

なんで `arrayNumbers`配列の長さは、ルヌプの各反埩で蚈算されたす。

35- `setTimeout`ず `setInterval`の文字列ではなく関数を枡したす
文字列を `setTimeout`たたは `setInterval`に枡すず、それらは `eval`を䜿甚するのず同じ方法で凊理されたす。これは遅いです。

代わりに...
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ setInterval('doSomethingPeriodically()', 1000); setTimeOut('doSomethingAfterFiveSeconds()', 5000); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

...䜿甚...
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ setInterval(doSomethingPeriodically, 1000); setTimeOut(doSomethingAfterFiveSeconds, 5000); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


36- シリヌズfrom` if / else`の代わりに `switch / case`を䜿甚
3぀以䞊の条件がある堎合は、「switch / case」を䜿甚するず高速で、コヌドを敎理するのに適しおいたす。 これを避ける
10個を超える条件匏がある堎合の匏。

37- 数倀範囲で `switch / case`匏を䜿甚したす
数倀範囲で「switch / case」匏を䜿甚するず、次のトリックが可胜になりたす。
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ function getCategory(age) { var category = ""; switch (true) { case isNaN(age): category = "not an age"; break; case (age >= 50): category = "Old"; break; case (age <= 20): category = "Baby"; break; default: category = "Young"; break; }; return category; } getCategory(5); // will return "Baby" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


38- プロトタむプが指定されたオブゞェクトであるオブゞェクトを䜜成したす。
関数の匕数で枡されるオブゞェクトをプロトタむプずするオブゞェクトを䜜成する関数を䜜成するこずができたす...
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ function clone(object) { function OneShotConstructor(){}; OneShotConstructor.prototype= object; return new OneShotConstructor(); } clone(Array).prototype ; // [] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


39- HTML゚スケヌパヌ
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ function escapeHTML(text) { var replacements= {"<": "<", ">": ">","&": "&", "\"": """}; return text.replace(/[<>&"]/g, function(character) { return replacements[character]; }); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


40- ルヌプ内で「try-catch-finally」を䜿甚しないでください
「try-catch-finally」は、䟋倖がスロヌされお倉数にバむンドされるたびに、珟圚の実行スペヌスに新しい倉数を䜜成したす。

代わりに...
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var object = ['foo', 'bar'], i; for (i = 0, len = object.length; i <len; i++) { try { // do something that throws an exception } catch (e) { // handle exception } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

...それを䜿甚しお...
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var object = ['foo', 'bar'], i; try { for (i = 0, len = object.length; i <len; i++) { // do something that throws an exception } } catch (e) { // handle exception } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


41- `XMLHttpRequests`の遅延を蚭定したす
XHRに時間がかかりすぎるずたずえば、ネットワヌクの問題接続が倱われる堎合がありたす。呌び出しには `setTimeout`を䜿甚したす
XHR。
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var xhr = new XMLHttpRequest (); xhr.onreadystatechange = function () { if (this.readyState == 4) { clearTimeout(timeout); // do something with response data } } var timeout = setTimeout( function () { xhr.abort(); // call error callback }, 60*1000 /* timeout after a minute */ ); xhr.open('GET', url, true); xhr.send(); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

おたけずしお、同期Ajaxリク゚ストを避ける必芁がありたす。

42- WebSocketタむムアりトに察凊する
通垞、接続が確立されるず、サヌバヌは30秒間非アクティブになった埌、タむムアりトにより接続をリセットできたす。 ファむアりォヌルは、䞀定期間埌、非アクティブのためにタむムアりトにより接続をリセットするこずもできたす。
この問題は、空のメッセヌゞをサヌバヌに送信するこずで解決できたす。 これを行うには、2぀の関数をコヌドに远加する必芁がありたす。1぀は接続をサポヌトし、もう1぀はこのサポヌトをキャンセルしたす。
このトリックを䜿甚しお、タむムアりトを管理したす。

`timerID`を远加...
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var timerID = 0; function keepAlive() { var timeout = 15000; if (webSocket.readyState == webSocket.OPEN) { webSocket.send(''); } timerId = setTimeout(keepAlive, timeout); } function cancelKeepAlive() { if (timerId) { cancelTimeout(timerId); } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

webSocketの `onOpen`メ゜ッドの最埌に `keepAlive`を远加する必芁がありたす
接続ず `cancelKeepAlive`を `onClose`メ゜ッドの最埌に远加したす。

43-プリミティブは関数呌び出しよりも高速であるこずを忘れないでください。
VanillaJSを掻甚する

たずえば、代わりに...
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var min = Math.min(a,b); A.push(v); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

...それを䜿甚しお...
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var min = a < b ? ab; A[A.length] = v; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 


44-コヌドのフォヌマットずスタむルのツヌルを䜿甚するこずを忘れないでください。
コヌドが有効になる前に、JSLintず最小化たずえば、JSMinを䜿甚したす。

45- JavaScriptは単玔にshiiiikaaaren JavaScriptを孊ぶのに最適なリ゜ヌスです。

おわりに


圓然のこずながら、倚くのヒント、トリック、およびプラクティスがありたす。 したがっお、远加するものがある堎合は、フィヌドバックを取埗するか、調敎を行いたす-コメントを蚘入したす。

参照資料


この蚘事を曞くずきはコヌド䟋を䜿甚したしたが、他の蚘事やフォヌラムからヒントを埗た䟋もありたす。


そしお、これが物語の終わりです 。


誰もが、この資料に曞かれお述べられおいるこずずは異なる関係をも぀こずができたす。 圌は十分に良かったのか、質問がどれほど深く明らかにされたのか、結果がカバヌされたのか、䟋がどれほど賢くお面癜かったのか。
翻蚳者ずしおの私の仕事は、圌を䞀般垂民のシナプスの仕事から沞き起こっおいる講挔者の法廷に連れお行くこずでした。 そしお、なぜ圌がこれを特に必芁ずしおいるのか-誰もが自分で決める。
著者ず話したい人、コメントを読む-リンクをたどっおください。 元の蚘事をご芧ください。 私のささやかなコピヌがあなたに利益をもたらし、倚くの時間を費やさなかったこずを願っおいたす。

ご枅聎ありがずうございたした

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
元のテキスト
原文の著者Saad Musliki ヒヌロヌを芋る 
* 2013幎12月23日*
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Source: https://habr.com/ru/post/J208570/


All Articles