JavaScript は世界で最も人気のあるプログラミング言語であり、Web 開発、モバイル アプリケーション開発 (PhoneGap、Appcelerator)、サーバーサイド開発 (Node.js および Wakanda) などに使用できます。 JavaScript は、多くの初心者がプログラミングの世界に入る最初の言語でもあります。これを使用して、ブラウザに単純なプロンプト ボックスを表示したり、nodebot または nodruino を通じてロボットを制御したりできます。明確な構造と高いパフォーマンスを備えた JavaScript コードを作成できる開発者は、現在、採用市場で最も求められている人材です。
この記事では、いくつかの例外を除いて、ブラウザーの JavaScript エンジンとサーバーサイドの JavaScript インタプリタの両方に適用される JavaScript のヒント、秘訣、ベスト プラクティスをいくつか紹介します。
この記事のサンプルコードは、最新バージョンの Google Chrome 30 (V8 3.20.17.15) でのテストに合格しました。
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. underfined、null、0、false、NaN、および空の文字列の論理結果はすべて false です
4. 行の最後にセミコロンを使用します
実際には、セミコロンを使用するのが最善です。書き忘れてもほとんどの場合、JavaScript インタプリタは自動的に追加されます。セミコロンが使用される理由の詳細については、「JavaScript におけるセミコロンの真実」の記事を参照してください。
5. オブジェクト コンストラクターを使用する
function Person(firstName, lastName){ this.firstName = firstName; this.lastName = lastName; } var Saad = new Person("Saad", "Mousliki");
6. typeof、instanceof、およびコンストラクターを慎重に使用します
typeof: 変数の元の型を文字列形式で返すために使用される、typeof は null であることに注意してください。オブジェクトも返します。ほとんどのオブジェクト タイプ (配列、日付など) もオブジェクトを返します
contructor: 内部プロトタイプ属性、コードを通じてオーバーライドできます
instanceof: JavaScript 演算子、プロトタイプ チェーンに含まれますコンストラクター内で、見つかった場合は true を返し、見つからない場合は false を返します
var arr = ["a", "b", "c"]; typeof arr; // 返回 "object" arr instanceof Array // true arr.constructor(); //[]
7. 自己呼び出し関数を使用します
この関数は、通常、自己呼び出し匿名関数と呼ばれ、作成後に直接自動的に実行されます。 ) または、関数式を直接呼び出します (即時に呼び出される関数式)。形式は次のとおりです:
(function(){ // 置于此处的代码将自动执行 })(); (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; for( var i=1; numbersArray.push(i++) < max;); // numbers = [1,2,3 ... 100]
11. ランダムな英数字文字列を生成します
function generateRandomAlphaNum(len) { var rdmString = ""; for( ; rdmString.length < len; rdmString += Math.random().toString(36).substr(2)); return rdmString.substr(0, len); }
12. JavaScriptの組み込み配列ソート関数はより良い方法は、特殊なコードを使用して実装することです (Fisher-Yates アルゴリズムなど)。StackOverFlow のこのディスカッションを参照してください。
13. 文字列スペースの削除
Java、C#、PHP などの言語には特別な文字列スペース削除関数が実装されていますが、JavaScript にはそれがありません。次のコードを使用して String オブジェクトのトリム関数を実行できます。
うわー新しい JavaScript エンジンには、trim() のネイティブ実装がすでにあります。
14. 配列間に追加
var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411]; numbers = numbers.sort(function(){ return Math.random() - 0.5}); /* numbers 数组将类似于 [120, 5, 228, -215, 400, 458, -85411, 122205] */
15. オブジェクトを配列に変換
16. 配列かどうかを確認
String.prototype.trim = function(){return this.replace(/^\s+|\s+$/g, "");};toString() メソッドが書き換えられた場合、機能しません。次の方法も使用できます:
var array1 = [12 , "foo" , {name "Joe"} , -2458]; var array2 = ["Doe" , 555 , 100]; Array.prototype.push.apply(array1, array2); /* array1 值为 [12 , "foo" , {name "Joe"} , -2458 , "Doe" , 555 , 100] */
ブラウザでフレームを使用しない場合は、instanceof を使用することもできますが、コンテキストが複雑すぎる場合はエラーが発生する可能性があります。
var argArray = Array.prototype.slice.call(arguments);
18. 配列の最大値と最小値を取得します
function isNumber(n){ return !isNaN(parseFloat(n)) && isFinite(n); }
19. 配列をクリアします
function isArray(obj){ return Object.prototype.toString.call(obj) === '[object Array]' ; }
20. 配列要素に対して直接 delete を使用すると、実際に削除されるわけではなく、要素を未定義に設定するだけです。配列要素の削除にはスプライスを使用する必要があります。
しないでください:
Array.isArray(obj); // its a new Array method
代わりに:
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] // myArray 的构造器已经丢失,instanceof 的结果将不正常 // 构造器是不能跨 frame 共享的 arr instanceof Array; // false
オブジェクトのプロパティを削除するときに delete を使用できます。
21. length 属性を使用して配列を切り詰めます
前の例では、length 属性を使用して配列を切り詰めることもできます:
var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411]; var maxInNumbers = Math.max.apply(Math, numbers); var minInNumbers = Math.min.apply(Math, numbers);
同時に、長さが属性を大きくすると、配列の長さの値が増加し、埋められる新しい要素として未定義が使用されます。 length は書き込み可能なプロパティです。
var myArray = [12 , 222 , 1000 ]; myArray.length = 0; // myArray will be equal to [].
22. 条件で論理ANDまたはORを使用する
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 结果为 [12, 548, "a", undefined × 1, 5478, "foo", 8852, undefined × 1, "Doe", 2154, 119] */
論理ORは、関数パラメータのデフォルト値などのデフォルト値を設定するために使用することもできます。
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 结果为 [12, 548, "a", 5478, "foo", 8852, undefined × 1, "Doe", 2154, 119]
23.map() 関数メソッドをデータに対してループさせます
var myArray = [12 , 222 , 1000 , 124 , 98 , 10 ]; myArray.length = 4; // myArray will be equal to [12 , 222 , 1000 , 124].
24.指定された小数点以下の桁数を維持します
myArray.length = 10; // the new array length is 10 myArray[myArray.length - 1] ; // undefined
toFixec() は数値ではなく文字列を返すことに注意してください。
25. 浮動小数点計算の問題
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();
なぜですか? 0.1+0.2 は 0.30000000000000004 に等しいためです。 JavaScript の数値は IEEE 754 標準に準拠して構築されており、内部的には 64 ビット浮動小数点で表されます。詳しくは、JavaScript の数値がどのようにエンコードされるかを参照してください。
この問題は、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(undefined); // 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]
注意传给splice的索引参数不要是负数,当是负数时,会从数组结尾处删除元素。
31、用JSON来序列化与反序列化
var person = {name :'Saad', age : 26, department : {ID : 15, name : "R&D"} }; var stringFromPerson = JSON.stringify(person); /* stringFromPerson 结果为 "{"name":"Saad","age":26,"department":{"ID":15,"name":"R&D"}}" */ var personFromString = JSON.parse(stringFromPerson); /* personFromString 的值与 person 对象相同 */
32、不要使用eval()或者函数构造器
eval()和函数构造器(Functionconsturctor)的开销较大,每次调用,JavaScript引擎都要将源代码转换为可执行的代码。
var func1 = new Function(functionCode); var func2 = eval(functionCode);
32、不要使用eval()或者函数构造器
eval()和函数构造器(Functionconsturctor)的开销较大,每次调用,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两个变量是在for循环的第一个声明中,二者只会初始化一次,这要比下面这种写法快:
for (var i = 0; i < arrayNumbers.length; i++)
35、传给setInterval()和setTimeout()时使用函数而不是字符串
如果传给setTimeout()和setInterval()一个字符串,他们将会用类似于eval方式进行转换,这肯定会要慢些,因此不要使用:
setInterval('doSomethingPeriodically()', 1000); setTimeout('doSomethingAfterFiveSeconds()', 5000);
而是用:
setInterval(doSomethingPeriodically, 1000); setTimeout(doSomethingAfterFiveSeconds, 5000);
36、使用switch/case代替一大叠的if/else
当判断有超过两个分支的时候使用switch/case要更快一些,而且也更优雅,更利于代码的组织,当然,如果有超过10个分支,就不要使用switch/case了。
37、在switch/case中使用数字区间
其实,switch/case中的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); // 将返回 "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中catch部分在执行时会将异常赋给一个变量,这个变量会被构建成一个运行时作用域内的新的变量。
切忌:
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时注意设置超时
XMLHttpRequests在执行时,当长时间没有响应(如出现网络问题等)时,应该中止掉连接,可以通过setTimeout()来完成这个工作:
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();
同时需要注意的是,不要同时发起多个XMLHttpRequests请求。
42、处理WebSocket的超时
通常情况下,WebSocket连接创建后,如果30秒内没有任何活动,服务器端会对连接进行超时处理,防火墙也可以对单位周期没有活动的连接进行超时处理。
为了防止这种情况的发生,可以每隔一定时间,往服务器发送一条空的消息。可以通过下面这两个函数来实现这个需求,一个用于使连接保持活动状态,另一个专门用于结束这个状态。
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); } }
keepAlive()函数可以放在WebSocket连接的onOpen()方法的最后面,cancelKeepAlive()放在onClose()方法的最末尾。
43、时间注意原始操作符比函数调用快,使用VanillaJS
比如,一般不要这样:
var min = Math.min(a,b); A.push(v);
可以这样来代替:
var min = a < b ? a : b; A[A.length] = v;
44、开发时注意代码结构,上线前检查并压缩JavaScript代码
别忘了在写代码时使用一个代码美化工具。使用JSLint(一个语法检查工具)并且在上线前压缩代码(比如使用JSMin)。注:现在代码压缩一般推荐 UglifyJS (http://www.php.cn/)
45、JavaScript博大精深,这里有些不错的学习资源
Code Academy资源:http://www.php.cn/
Marjin Haverbekex编写的Eloquent JavaScript:http://www.php.cn/
John Resig编写的Advanced JavaScript:http://www.php.cn/
以上就是JavaScript 开发的45个技巧的内容,更多相关内容请关注PHP中文网(www.php.cn)!

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SublimeText3 中国語版
中国語版、とても使いやすい

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール
