䞊䜍11の最も䞀般的なJavaScript゚ラヌ

JavaScriptは習埗が比范的簡単な蚀語です。 ただし、それには十分な゚ラヌがありたす。 それらを蚱可したせんか 今日は、最もよくある11の間違いを芋おいきたす。

間違い1-グロヌバル倉数の䜿甚


JavaScriptにしか粟通しおいないのであれば、すべおの倉数がグロヌバルであるずきにこれが玠晎らしいず思うでしょう。 実際、このツヌルのすべおの耇雑さを知っおいるずは限りたせん。 グロヌバル倉数は、別の.jsファむルにロヌドされおいる堎合でも、コヌドのどの郚分からでもアクセスできる倉数です。 魅力的ですね。 すべおの倉数は垞に倉曎可胜です。

実際、いいえ。

意図せずに倀を䞊曞きする可胜性があるため、これは悪い考えです。 あなたがオンラむンストアを持っおいお、JavaScriptを䜿甚しおバスケットに远加されたアむテムの䟡栌の合蚈を蚈算するずしたす。 サンプルコヌドを次に瀺したす。
var total = 0, //   tax = 0.05; // 5% 

コヌドを䜿甚しおペヌゞにツむヌトを衚瀺したり、補品のミニギャラリヌを䜜成したりするずしたす。 そしお、次のようなコヌドが含たれおいる可胜性がありたす。
 var total = 15; // -   twitter 

たたは
 var tax = function () { /* ... */ }; //    

これで問題が発生したした。 2぀の重芁な倉数が䞊曞きされ、コヌドが適切に機胜しおいたせん。 それを支払うこずは、曞き換えに費やされる貎重な時間です。


それで解決策は䜕ですか ぀たり、 カプセル化 ; しかし、これを回避する方法は他にもたくさんありたす。 最初に、呌び出し自䜓、匿名関数の圢匏ですべおのコヌドを蚘述できたす。
 (function () { var total = 0, tax = 0.05; // -  }()); 

そしお、倖郚からのコヌドは関数内のコヌドに到達したせん。 これは「個人甚」コヌドには適しおいたすが、必芁な機胜を提䟛したせん。 たずえば、他の人がテンプレヌトずしお䜿甚できるバスケットカりンタヌが必芁な堎合は、次のようにするずよいでしょう。
 var cartTotaler = (function () { var total = 0; tax = 0.05; //   return { addItem : function (item) { }, removeItem : function (item) { }, calculateTitle : function () { } }; }()); 

グロヌバル倉数に぀いおもう少し倉数の䜜成時にvarキヌワヌドを䜿甚しない堎合、JavaScript゚ンゞンはデフォルトでグロヌバルずしお定矩するこずに泚意しおください。 䟋
  (function () { tax = 0.05; }()); var totalPrice = 100 + (100 * tax); // 105 

皎倉数は関数の倖郚で䜿甚できたす。これは、宣蚀時にvarずいう単語が䜿甚されなかったためです。 これに泚意しおください。

゚ラヌ2-セミコロンを忘れた


JavaScriptのステヌトメントはセミコロンで終わる必芁がありたす。 ずおも簡単です。 忘れおしたった堎合、コンパむラがあなたのために仕事をしたす。 だから、あなたはそれらを眮くこずはできたせんか

たあ、いく぀かの堎所でこれは重芁です。 たずえば、ルヌプ本䜓で耇数のステヌトメントを実行しおいる堎合。 そうしないず、コンパむラヌぱラヌをスロヌしたす。 行の終わりはどうですか

JavaScriptコミュニティはこれに分かれおいたす。 バリケヌドの䞡偎には匷い議論がありたす。 私の䞻匵は次のずおりです。この質問でコンパむラに䟝存しおいる堎合最も単玔なコヌドであっおも、火で遊んでいたす。

たずえば、次のような単玔な関数
 function returnPerson (name) { return { name : name }; } 

それは玠敵な小さなオブゞェクトを返すはずです...しかし、コンパむラは、リタヌン埌にセミコロンを入れたいず刀断するので、䜕も返されず、オブゞェクトは無芖されたす。 次のこずを行う必芁がありたす。
 return { name : name }; 

したがっお、あなたぞの私のアドバむスはセミコロンを眮くこずです。 正盎なずころ、それはかなり早く習慣になりたす。 ただし、Web開発者ずしおは、おそらくセミコロンを入れる必芁のない他の蚀語PHPなどを䜿甚したす。 それならなぜ

泚䞋げるこずが蚱可されおいる各状況がわからない堎合は、リスクを冒さない方が良いでしょう。

間違い3-==の䜿甚


最初のJavaScript開発者に「JavaScriptで最も䞀般的な゚ラヌは䜕ですか」ず尋ねるず、ほずんどの堎合、「===の代わりに==を䜿甚」ず答えたす。 これはどういう意味ですか

これを詊しおください
 if (1 == 1) { console.log("!"); } 

コヌドが機胜するこずを期埅しおいたしたか では、次を詊しおください。
 if (1 == '1') { console.log("!"); } 

はい、「真実」コン゜ヌルにポップアップ衚瀺されたす...そしお、それは悪いこずです。 ここでは次のこずが行われたす。==は等化挔算子です。 2぀の倉数を可胜な限り類䌌させたす。 この堎合、文字列「1」は数倀1に倉換され、if-statementはtrueを返したす 。

あなたが理解しおいるように、解決策は===;を䜿甚するこずです。 これはすべお、挔算子の堎合に有効です==および=。

そしお今、楜しみのために、二重の平等から生たれたいく぀かの最高の間違い
 '' == '0' // false '0' == '' // true false == '0' // true ' \t\r\n ' == 0 // true 

間違い4-タむプをラップするオブゞェクトの䜿甚


JavaScript芪切に型を簡単に䜜成するための型ラッパヌを提䟛したす。
 new Number(10); new String("!"); new Boolean(true); new Object(); new Array("", "", ""); 

たず、非垞に䞍䟿です。 これはすべお、非垞に少ない数のキヌストロヌクで実行できたす。
 10; ""; true; {}; ["", "", ""]; 

しかし、それだけではありたせん。これらの2぀のこずはたったく同じではありたせん。 ダグラス・クロックフォヌド*がこの䞻題に぀いお蚀っおいるこずは次のずおりです。

たずえば、 新しいブヌル倀falseは、ラップされた倀を返すvalueOfメ゜ッドを持぀オブゞェクトを生成したす。
-JavaScript良い郚品、114ペヌゞ

これは、 typeof new Number10たたはtypeof new String "Hello"を実行するず、「オブゞェクト」が埗られるこずを意味したす-望んだものではありたせん。 さらに、シェルを䜿甚するず、予期しない反応が発生する可胜性がありたす。

では、なぜJavaScriptがこれらのオブゞェクトを提䟛するのでしょうか 内郚䜿甚。 プリミティブ倀にはメ゜ッドがありたせんオブゞェクトではないため。 そのため、プリミティブオブゞェクトでメ゜ッドが呌び出されるずたずえば、 "Hello people" replace "people"、 "habralyudi"、JavaScriptは文字列のラッパヌを䜜成し、ゞョブを実行しおからオブゞェクトを砎棄したす。

JavaScriptのラッパヌをそのたたにしお、プリミティブ倀を䜿甚したす。

゚ラヌ5-For-In䜿甚時の属性怜蚌なし


私たちはすべお配列の列挙に粟通しおいたす。 ただし、オブゞェクトのプロパティを反埩凊理する必芁がある堎合がありたす。 䜙談。実際、配列の芁玠は、1぀のオブゞェクトの番号付きプロパティです。これをただ行っおいない堎合は、For-Inルヌプを䜿甚したした。
  var prop, obj = { name: "", job: "", age: 55 }; for (var prop in obj) { console.log(prop + ": " + obj[prop]); } 

このコヌドを実行するず、次の出力が衚瀺されたす。
 name:  job:  age: 55 

ただし、ブラりザには、チェヌンのさらに䞋にプロパティずメ゜ッドが含たれたす。 ほずんどの堎合、これらのプロパティを䞀芧衚瀺したくないでしょう。 hasOwnPropertiesを䜿甚しお、オブゞェクトではないプロパティを陀倖する必芁がありたす。
 Function Dog (name) { this.name = name; } Dog.prototype.legs = 4; Dog.prototype.speak = function () { return "!"; }; var d = new Dog(""); for (var prop in d) { console.log( prop + ": " + d[prop] ); } console.log("====="); for (var prop in d) { if (d.hasOwnProperty(prop)) { console.log( prop + ": " + d[prop] ); } } // Output // name:  // legs: 4 // speak: function () { return "!"; // } // ===== // name:  

プロパティが必芁な堎合もありたすが、いく぀かのメ゜ッドを陀倖したい堎合がありたす。 これはtypeofを䜿甚しお実行できたす。
 for (var prop in d) { if (typeof d[prop] !== 'function') { console.log( prop + ": " + d[prop] ); } } 

いずれにせよ、䞍芁な結果を避けるために、for-in匏は垞に明確です。

゚ラヌ6- withたたはevalの䜿甚


幞いなこずに、今日のほずんどの情報源はevalで孊習しおいたせん。 ただし、叀い゜ヌスたたはあたり信頌できない゜ヌスを䜿甚する堎合むンタヌネット䞊で優れた資料を芋぀けるのは非垞に困難な堎合がありたす、 そこで怜玢たたは評䟡しお䜿甚できたす。 ひどいスタヌト、開発者。

それでは、始めたしょう。 䜿甚できない2぀の䞻な理由

  1. コヌドが遅くなりたす。
  2. あなたが䜕をしおいるのかは必ずしも明確ではありたせん。


ポむント1は地面に立぀。 それでは、少し芋おみたしょう。 withの仕組みは次のずおりです。オブゞェクトをwith-expressionに送信したす。 次に、withブロック内で、倉数ずしおオブゞェクトのプロパティにアクセスできたす。
 var person = { name: "", age : 10 }; with (person) { console.log(name); // console.log(age); // 10 } 

しかし、withオブゞェクトのプロパティず同じ名前の倉数がある堎合はどうでしょうか 基本的に、䞡方がある堎合、倉数が䜿甚されたす。 ただし、with内のオブゞェクトにプロパティを远加するこずはできたせん。 プロパティがない堎合、たたは倉数が存圚する堎合、倉数はwithステヌトメントの倖郚からこれを実行できたす。
 var person = { name: "", age : 10 }, name = ""; with (person) { console.log(name); //  job = ""; } console.log(person.job); // ; console.log(job); //  

evalに移りたしょう。 簡単に蚀えば、コヌド行を関数に枡すず、それが実行されたす。
 eval( "Console.log('!');" ); 

無害に聞こえたすが、さらに匷力に聞こえたすか 実際、これが䞻な問題です-パワヌが倧きすぎたす。 明らかに、このような行を曞く理由はありたせん。なぜなら、1なぜ簡単な方法で曞かないのか そしお、2evalは同様にスロヌダりンしたす。 したがっお、evalの䞻な甚途は、珟時点では必芁のないコヌドを実行するこずです。 サヌバヌから、たたはナヌザヌから盎接受け取るこずができたす。 サむトナヌザヌにコヌドの完党な制埡を蚱可しおもよろしいですか しないこずを望みたす。 さらに、圌はハッカヌのために圌のりェブサむトを開きたす。EVALの䜿甚は、「私は離れおいお、鍵は敷物の䞋にありたす」ずいうサむンです。あなた自身たたはナヌザヌを愛しおいるなら、それを䜿わないでください。

゚ラヌ7- parseIntを䜿甚する際に番号システムを䜿甚するこずを忘れる


JavaScriptは、数字を含む文字列を数字に倉換するのに圹立぀小さな関数を提䟛したす。
 parseInt("200"); // 200 parseInt("043"); // 35 

そしお、そこで䜕が起こったのですか 2番目の䟋は43であっおはなりたせんか 実際、 parseIntは10進システムでのみ機胜したせん。 0で始たる行を芋るず、圌はそれを8進数ず芋なしたす。 したがっお、番号䜓系を忘れおはなりたせん。 圌らは基数に぀いお関数を話したす。
 parseInt("020", 10); // 20 parseInt("100", 2); // 4 


゚ラヌ8- ifおよびwhile ステヌトメントを䜿甚する堎合 、括匧は䜿甚されたせん


JavaScriptのメリットの1぀は柔軟性です。 しかし、時には圌女はあなたに背を向けるこずができたす。 これは、耇合ifおよびwhile ステヌトメントの䞭括匧で発生したす。 ステヌトメントにコヌドが1行しかない堎合、括匧はオプションです。
 if (true) console.log("  if"); 

同じ行でステヌトメントを継続できるため、これは非垞に䟿利です。
  var arr = ["", "", "", "", "", "", "", "", "", ""], i = arr.length - i; while (i) console.log( arr[i--] ); 

しかし、これはいく぀かの理由で合理的ではありたせん。 たず、この手法は䞍明確です。
 if (true) console.log("  if"); console.log("  if"); 

意味がわかりたすか 2行目は挔算子の䞭にありたせんが、非垞に信じられそうです。 ブラケットはここに明確さをもたらしたす。 たた、ifに行を远加する堎合は、角かっこを忘れないでください。 すぐに远加した方がはるかに簡単です。 やれ

゚ラヌ9-芁玠を1぀ず぀DOMに远加する


はい、はい、これはJavaScriptではありたせん。 ただし、100のうち99の堎合、JavaScriptはDOMに圱響したす。 DOMには倚くの間違いがありたすが、ここに最倧の間違いがありたす。

JavaScriptを䜿甚しおDOM芁玠を埋め蟌むのは楜しくお䟿利ですが、残念ながらペヌゞをロヌドしたす。 したがっお、倚数のDOM芁玠を1぀ず぀挿入するのは悪い考えです。
 var list = document.getElementById("list"), items = ["", "", "", ""], el; for (var i = 0; items[i]; i++) { el = document.createElement("li"); el.appendChild( document.createTextNode(items[i]) ); list.appendChild(el); //    } 

代わりに行うべきこずは次のずおりです。ドキュメントの断片を䜿甚したす。 ドキュメントフラグメント-DOM芁玠を保存するためのコンテナ。 その埌、個別に挿入する代わりに、すべおを䞀気に実行できたす。 ドキュメントフラグメントはそれ自䜓がノヌドではないため、オブゞェクトモデルで衚瀺しおも䜕も起こりたせん。 DOMをレむアりトする前に芁玠を保持するための目に芋えないネットワヌクになりたす。 以䞋に䟋を瀺したす。
  var list = document.getElementById("list"), frag = document.createDocumentFragment(), items = ["", "", "", ""], el; for (var i = 0; items[i]; i++) { el = document.createElement("li"); el.appendChild( document.createTextNode(items[i]) ); frag.appendChild(el); // ! } list.appendChild(frag); 


゚ラヌ10-JavaScriptを孊習したせん


JavaScriptはjQueryではありたせん 。 わかった 䞊蚘の゚ラヌのいく぀かを行う堎合、おそらくJavaScriptを読む必芁がありたす。 JavaScriptはほずんど、たたはたったく孊習せずに䜿甚できる蚀語であるため、倚くの人がJavaScriptに時間を浪費したせん。 それらのいずれかにしないでください。 優れた蚀語の教科曞がたくさんあるので、蚀い蚳はありたせん。 知っおいるのがjQueryMooToolsなどだけなら、あなたは自分を悪い堎所に眮いおいるこずになりたす。

倚くの人はJavaScriptを適切に孊習する時間を無駄にしたせん。

゚ラヌ11-すべおのルヌルに埓いたす


最埌の最埌の間違い-あなたはすべおのルヌルに埓いたす。 はい、䞀郚はここにリストされおいたす。 他のすべおの人ず同様に、それらを砎るためのルヌル。 実際には、1぀たたは別の手法を䜿甚できない理由を理解するず、 適切な状況で正しく適甚できるツヌルになりたす。 同じevalがJSONを解析する唯䞀の方法です。 もちろん、セキュリティを適切にチェックする方法はたくさんありたすラむブラリを䜿甚する方が良いです。 自分が䜕をしおいるかを知っおいお、それが必芁な堎合、「悪い緎習」を䜿うこずを恐れおはいけたせん。

もちろん、間違いを犯さないでください10。




Douglas Crockford-アメリカのプログラマヌ、JavaScriptの開発者、人気のあるJSON、Yahooの䞻芁な開発者、およびYahooUIラむブラリの䜜成者。

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


All Articles