JavaScript

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

JavaScript
パラダイムイベント駆動型機能的必須
によって設計されたブレンダン・アイクNetscapeの最初に、他の人もECMAScript標準に貢献しています
初登場1995年12月4日; 25年前[1] (1995-12-04
安定リリース
ECMAScript 2021 [2] ウィキデータでこれを編集する / 2021年6月; 5ヶ月前 (20216月
プレビューリリース
ECMAScript 2022 [3] ウィキデータでこれを編集する / 2021年7月22日; 3ヶ月前 (2021年7月22日
規律の入力ダイナミック弱いアヒル
ファイル名拡張子
  • .js
  • .cjs
  • .mjs[4]
Webサイトwww .ecma-international .org / publications-and-standards / standard / ecma-262 /
主要な実装
V8JavaScriptCoreSpiderMonkeyChakra
に影響を受けた
Java[5] [6] スキーム[6] セルフ[7] AWK[8] HyperTalk [9]
影響を受ける
TypeScriptCoffeeScriptAssemblyScriptActionScriptDartObjective-JOpaHaxe

JavaScriptの/ ɑː V ə ˌ S K R ɪ P T /)、[10]しばしば略記JS、あるプログラミング言語に準拠していることのECMAScript仕様。[11] JavaScriptは高レベルであり、多くの場合、ジャストインタイムでコンパイルされたマルチパラダイムです。これは持っている動的タイピングプロトタイプベースの オブジェクト指向及びファーストクラスの機能を

JavaScriptは、HTMLCSSと並んで、ワールドワイドウェブのコアテクノロジーの1つです[12] Webサイトの97%以上がクライアント側Webページの動作に使用しており[13]、多くの場合、サードパーティのライブラリが組み込まれています[14]すべての主要なWebブラウザーにユーザーのデバイスでコードを実行するための専用のJavaScriptエンジンがあります。

マルチパラダイム言語として、JavaScriptはイベント駆動型関数 、および命令型プログラミングスタイルをサポートしますそれは持っているアプリケーションプログラミングインタフェーステキスト、日付、を扱うための(API)は、正規表現、標準データ構造、およびドキュメントオブジェクトモデル(DOM)を。

ECMAScriptの標準は、任意の含まれていない入力/出力など(I / O)、ネットワークストレージ、又はグラフィック設備。実際には、Webブラウザまたはその他のランタイムシステムは、I / O用のJavaScriptAPIを提供します。

JavaScriptエンジンは、もともとWebブラウザーでのみ使用されていましたが、現在は一部のサーバーやさまざまなアプリケーションのコアコンポーネントになっていますこの使用法で最も人気のあるランタイムシステムはNode.jsです。

JavaScriptとJavaの間には、言語名、構文、それぞれの標準ライブラリなどの類似点がありますが、2つの言語は異なり、設計が大きく異なります。

歴史

Netscapeでの作成

モザイク Webブラウザを持つ最初のブラウザとして1993年に発売されたグラフィカル・ユーザー・インターフェース非技術的な人々にアクセス可能な、それは初期の急速な成長に重要な役割を果たし、ワールド・ワイド・ウェブ[15]その後、Mosaicの主要な開発者は、1994年にさらに洗練されたブラウザであるNetscapeNavigatorをリリースしたNetscapeCorporationを設立しました。Navigatorはすぐに最も使用されるブラウザになりました。[16]

Webのこれらの形成期の間、Webページは静的でしかなく、ページがブラウザーにロードされた後の動的な動作の機能を欠いていました。急成長しているWeb開発シーンでは、この制限を取り除きたいという要望があったため、1995年にNetscapeはスクリプト言語をNavigatorに追加することを決定しました。彼らはこれを達成するために2つのルートを追求:とのコラボレーションSun Microsystemsの埋め込むためのJava プログラミング言語を、また雇用しながら、ブレンダン・アイクを埋め込むためのScheme言語を。[6]

Netscapeの経営陣はすぐに、EichがJavaに似た構文で、Schemeや他の既存のスクリプト言語に似ていない新しい言語を考案することが最善の選択肢であると判断しました。[5] [6] 1995年9月にナビゲーターベータの一部として最初に出荷されたとき、新しい言語とそのインタープリターの実装はLiveScriptと呼ばれていましたが、12月の公式リリースのために名前がJavaScriptに変更されました。[6] [1] [17]

JavaScript名の選択は混乱を引き起こし、Javaに直接関連していることを意味します。当時、ドットコムブームが始まり、Javaは最新の新しい言語でした。そのため、Eichは、JavaScriptの名前を、独自の新しい言語キャッシュを提供するためのNetscapeによるマーケティング戦略と見なしました。[18]

マイクロソフトによる採用

Microsoftは1995年にInternetExplorerをデビューさせ、Netscapeとのブラウザ戦争を引き起こしました。JavaScriptの面では、MicrosoftはNavigatorインタープリターリバースエンジニアリングしてJScriptと呼ばれる独自のインタープリターを作成しました[19]

JScriptは、CSSHTMLの拡張機能の初期サポートとともに、1996年に最初にリリースされましたこれらの実装はそれぞれ、Navigatorの対応する実装とは著しく異なっていました。[20] [21]これらの違いにより、開発者は両方のブラウザでWebサイトを適切に機能させることが困難になり、「Netscapeで最もよく表示される」ロゴと「InternetExplorerで最もよく表示される」ロゴが数年間広く使用されるようになりました。[20] [22]

JScriptの台頭

1996年11月、Netscape、すべてのブラウザベンダーが準拠できる標準仕様の開始点として、JavaScriptをEcmaInternationalに提出しました。これにより、1997年6月に最初のECMAScript言語仕様が正式にリリースされました

標準化プロセスは数年間続き、1998年6月にECMAScript 2がリリースされ、1999年12月にECMAScript3がリリースされました。ECMAScript4の作業は2000年に始まりました。[19]

一方、マイクロソフトはブラウザ市場でますます支配的な地位を獲得しました。2000年代初頭までに、Internet Explorerの市場シェアは95%に達しました。[23]これは、JScriptWeb上のクライアント側スクリプトの事実上の標準になることを意味しました。

Microsoftは当初、標準化プロセスに参加し、JScript言語でいくつかの提案を実装しましたが、最終的にはEcmaの作業でのコラボレーションを停止しました。したがって、ECMAScript4は一時停止されました。

成長と標準化

2000年代初頭のInternetExplorerの支配期間中、クライアント側のスクリプトは停滞していました。これは、Netscapeの後継であるMozillaFirefoxブラウザをリリースした2004年に変化し始めました。 Firefoxは多くの人に好評で、InternetExplorerから大きな市場シェアを獲得しました。[24]

2005年にMozillaはECMAInternationalに参加し、ECMAScript for XML(E4X)標準の作業を開始しました。これにより、Mozillaは、ECMAScript4ドラフトに基づいたActionScript3言語でE4Xを実装していたMacromedia(後にAdobe Systemsに買収されましたと共同で作業することになりました。目標は、ActionScript3を新しいECMAScript4として標準化することでした。この目的のために、AdobeSystemsオープンソースプロジェクトとしてTamarinの実装をリリースしました。ただし、TamarinとActionScript 3は、確立されたクライアント側スクリプトとはあまりにも異なっており、Microsoftの協力がなければ、ECMAScript4は実現しませんでした。

一方、ECMAの作業に関係のないオープンソースコミュニティでは、非常に重要な開発が行われていました。 2005年、Jesse James Garrettは、Ajaxという用語を作り出し、JavaScriptがバックボーンである一連のテクノロジーについて説明したホワイトペーパーをリリースしました。これにより、データをバックグラウンドでロードできるWebアプリケーションを作成し、ページ全体を表示する必要がなくなりました。リロードします。これは、オープンソースライブラリとその周りに形成されたコミュニティが主導するJavaScriptのルネッサンス期を引き起こしました。jQueryPrototypeDojo ToolkitMooToolsなど、多くの新しいライブラリが作成されました

Googleはそのデビュークロームで、2008年にブラウザをV8速くその競争よりだったJavaScriptエンジン。[25] [26]主要な革新はジャストインタイムコンパイル(JIT)であり[27]、他のブラウザベンダーはJIT用のエンジンをオーバーホールする必要がありました。[28]

2008年7月、これらの異なる政党がオスロでの会議に集まりましたこれにより、2009年の初めに、関連するすべての作業を組み合わせて言語を前進させるという最終的な合意に至りました。その結果が、2009年12月にリリースされたECMAScript5標準でした。

成熟に達する

言語に関する野心的な作業は数年間続き、2015年ECMAScript 6の発行により、追加および改良の広範なコレクションが正式化されました。[29]

Ryan Dahlによる2009年Node.jsの作成は、Webブラウザー以外でのJavaScriptの使用の大幅な増加を引き起こしました。 Nodeは、V8エンジン、イベントループ、およびI / O API組み合わせて、スタンドアロンのJavaScriptランタイムシステムを提供します。[30] [31] 2018年の時点で、Nodeは何百万もの開発者によって使用されており[32]npm世界のパッケージマネージャーの中で最も多くのモジュールを持っていました。[33]

ECMAScriptドラフト仕様は現在GitHub公開されおり、エディションは定期的な年次スナップショットを介して作成されます。[34]言語の潜在的な改訂は、包括的な提案プロセスを通じて精査されます。[35] [36]現在、開発者はエディション番号の代わりに、今後の機能のステータスを個別にチェックします。[34]

現在のJavaScriptエコシステムには、多くのライブラリフレームワーク、確立されたプログラミングプラクティス、およびWebブラウザー以外でのJavaScriptの実質的な使用法があります。さらに、シングルページアプリケーションやその他のJavaScriptを多用するWebサイトの台頭に伴い、開発プロセスを支援するために多数のトランスパイラーが作成されています。[37]

商標

特に指定がない限り、「JavaScriptが」である商標オラクル・コーポレーション米国インチ [38] [39]

ウェブサイトのクライアント側の使用法

JavaScriptは、Webの主要なクライアント側スクリプト言語であり、97%のWebサイトがこの目的でJavaScriptを使用しています。[13]スクリプトはHTMLドキュメントに埋め込まれている、またはHTMLドキュメントから含まれており、DOMと対話しますすべての主要なWebブラウザーに、ユーザーのデバイスでコードを実行するJavaScriptエンジン組み込まれています。

スクリプト化された動作の例

ライブラリとフレームワーク

Webサイトの80%以上が、クライアント側のスクリプトにサードパーティのJavaScriptライブラリまたはWebフレームワークを使用しています。[14]

jQueryは、これまでで最も人気のあるライブラリであり、75%以上のWebサイトで使用されています。[14] FacebookはWebサイト用にReactライブラリを作成し、後でオープンソースとしてリリースしましたTwitterを含む他のサイトが現在それを使用しています。同様に、YouTubeGmailなどのウェブサイト用にGoogle作成しAngularフレームワークは、現在、他のユーザーが使用しているオープンソースプロジェクトです。[14]

対照的に、「Vanilla JS」という用語は、ライブラリやフレームワークを使用せず、代わりに標準のJavaScript機能に完全に依存しているWebサイトを表すために造られました。[40]

その他の使用法

JavaScriptの使用は、Webブラウザーのルーツを超えて拡大していますJavaScriptエンジンは、サーバー側のWebサイトの展開とブラウザー以外のアプリケーションの両方で、他のさまざまなソフトウェアシステムに組み込まれています

サーバーサイドJavaScriptの使用を促進する最初の試みであったのNetscape Enterprise Serverの、マイクロソフトインターネットインフォメーションサービス[41] [42]が、彼らは小さなニッチました。[43]サーバー側の使用は、Node.jsその他のアプローチの作成により、最終的に2000年代後半に増加し始めました[43]

ElectronCordovaReact Native、およびその他のアプリケーションフレームワークは、JavaScriptで実装された動作を備えた多くのアプリケーションを作成するために使用されてきました。その他の非ブラウザアプリケーションには、PDFドキュメントのスクリプト作成のためのAdobe Acrobatサポート[44]、JavaScriptで記述されたGNOMEシェル拡張機能が含まれます。[45]

JavaScriptは最近、通常はNode.jsを利用することにより、一部の組み込みシステムに登場し始めました[46] [47] [48]

機能

以下の機能は、特に明記されていない限り、すべての準拠ECMAScript実装に共通です。

命令型で構造化された

JavaScriptはCの構造化プログラミング構文の多くをサポートしていますステートメント、ループ、ステートメント、ループなど)。1つの部分的な例外はスコープです:元々JavaScriptに;でスコープする関数しかありませんでした次に、ブロックスコープがECMAScript2015でキーワードとを使用して追加されましたCと同様に、JavaScriptはステートメントを区別します。Cとの構文上の違いの1つは、セミコロン(ステートメントを終了する)を省略できる自動セミコロン挿入です。[49]ifwhileswitchdo whilevarletconst

弱いタイプ

JavaScriptは弱い型付けです。つまり、使用する操作に応じて特定の型が暗黙的にキャストされます。[50]

  • 二項+演算子は、両方のオペランドが数値でない限り、両方のオペランドを文字列にキャストします。これは、加算演算子が連結演算子を兼ねているためです。
  • 二項-演算子は常に両方のオペランドを数値にキャストします
  • 両方の単項演算子(+-)は常にオペランドを数値にキャストします

値は次のような文字列にキャストされます:[50]

  • 文字列はそのままにします
  • 数値は文字列表現に変換されます
  • 配列の要素は文字列にキャストされ、その後コンマ(,)で結合されます。
  • 他のオブジェクトは文字列[object Object]変換されます。ここObjectで、はオブジェクトのコンストラクターの名前です。

値は、文字列にキャストしてから文字列を数値にキャストすることにより、数値にキャストされます。これらのプロセスは定義することによって変更することができるtoStringvalueOfに機能プロトタイプの文字列と数字は、それぞれ鋳造します。

JavaScriptは、ルールの複雑さが矛盾と誤解される可能性があるため、これらの変換を実装する方法について批判を受けています。[51] [50]たとえば、文字列に数値を追加する場合、連結を実行する前に数値が文字列にキャストされますが、文字列から数値を減算する場合、減算を実行する前に文字列が数値にキャストされます。

JavaScript型変換
左オペランド オペレーター 右オペランド 結果
[] (空の配列) + [] (空の配列) "" (空の文字列)
[] (空の配列) + {} (空のオブジェクト) "[object Object]" (ストリング)
false (ブール値) + [] (空の配列) "false" (ストリング)
"123"(ストリング) + 1 (番号) "1231" (ストリング)
"123" (ストリング) - 1 (番号) 122 (番号)

多くの場合も上述{} + []で得られた0(番号)。これは誤解を招く可能性があります。{}は空のオブジェクトではなく空のコードブロックとして解釈され、残りの単項演算+によって空の配列が数値にキャストされます。式を括弧({} + [])で囲むと、中括弧は空のオブジェクトとして解釈され、式の結果は"[object Object]"期待どおりになります。[50]

動的

タイピング
JavaScriptは、他のほとんどのスクリプト言語と同様に動的に型指定されますタイプは、関連付けられているではなく表現。たとえば、最初に数値にバインドされ変数を文字列に再割り当てできます[52] JavaScriptは、ダックタイピングを含むオブジェクトのタイプをテストするためのさまざまな方法をサポートしています[53]
実行時評価
JavaScriptには、eval実行時に文字列として提供されるステートメントを実行できる関数が含まれています。

オブジェクト指向(プロトタイプベース)

JavaScriptでのプロトタイプの継承は、DouglasCrockfordによって次のように説明されています

プロトタイプオブジェクトを作成してから、…新しいインスタンスを作成します。オブジェクトはJavaScriptで変更可能であるため、新しいインスタンスを拡張して、新しいフィールドとメソッドを提供できます。これらは、さらに新しいオブジェクトのプロトタイプとして機能できます。多くの同様のオブジェクトを作成するためにクラスは必要ありません…オブジェクトはオブジェクトから継承します。それよりもオブジェクト指向は何でしょうか?[54]

JavaScriptでは、オブジェクト連想配列であり、プロトタイプで拡張されています(以下を参照)。各キーはオブジェクトプロパティの名前を提供し、そのような名前を指定する構文上の方法は、ドット表記(obj.x = 10)とブラケット表記(obj['x'] = 10)の2つです。プロパティは、実行時に追加、リバウンド、または削除される場合があります。オブジェクトのほとんどのプロパティ(およびオブジェクトのプロトタイプ継承チェーンに属するプロパティ)は、for...inループを使用して列挙できます。

プロトタイプ
JavaScriptはプロトタイプを使用し、他の多くのオブジェクト指向言語継承にクラス使用します[55] JavaScriptのプロトタイプを使用して多くのクラスベースの機能をシミュレートすることが可能です。[56]
オブジェクトコンストラクタとして機能します
関数は、その典型的な役割とともに、オブジェクトコンストラクターとしても機能します。関数呼び出しの前にnew付けると、プロトタイプのインスタンスが作成され、コンストラクターからプロパティとメソッド(Objectプロトタイプのプロパティを含む)が継承されます[57] ECMAScript 5はObject.createメソッドを提供し、Objectプロトタイプから自動的に継承することなくインスタンスを明示的に作成できるようにします(古い環境ではプロトタイプをに割り当てることができますnull)。[58]コンストラクターのprototypeプロパティは、新しいオブジェクトの内部プロトタイプに使用されるオブジェクトを決定します。コンストラクターとして使用される関数のプロトタイプを変更することにより、新しいメソッドを追加できます。以下のようなJavaScriptの組み込みのコンストラクタ、ArrayまたはObject、変更可能なプロトタイプもあります。Objectプロトタイプを変更することは可能ですが、JavaScriptのほとんどのオブジェクトはObjectプロトタイプからメソッドとプロパティを継承し、プロトタイプが変更されることを期待しない可能性があるため、一般的には悪い習慣と見なされます。[59]
メソッドとして機能する
多くのオブジェクト指向言語とは異なり、関数定義とメソッド定義の間に違いはありませんむしろ、この区別は関数の呼び出し中に発生します。関数がオブジェクトのメソッドとして呼び出されると、関数のローカルthisキーワードは、その呼び出しのためにそのオブジェクトにバインドされます。

機能的

機能があるファーストクラス関数はオブジェクトと見なされます。[60]このように、関数のような、プロパティおよびメソッドを有することができる.call().bind()[61]ネストされた関数は別の関数内で定義された関数です。これは、外部関数が呼び出されるたびに作成されます。加えて、各ネストされた関数は、フォーム字句クロージャ字句範囲(任意の定数、ローカル変数、引数値を含む)は、外側の関数のそれぞれの内側の関数オブジェクトの内部状態の一部となる、外側の関数の実行が終了した後も。[62] JavaScriptは無名関数もサポートしています

委任

JavaScriptは、暗黙的および明示的な委任をサポートしています

役割として機能します(特性とミックスイン)
JavaScriptはTraits [64] [65]MixinsなどのRole [63]パターンのさまざまな関数ベースの実装をネイティブにサポートしています[66]このような関数は、その本体キーワードにバインドされた少なくとも1つのメソッドによって追加の動作を定義します次に、プロトタイプチェーンを介して共有されない追加の動作を特徴とする必要があるオブジェクトを介して、またはオブジェクトにロールを明示的に委任する必要があります。thisfunctioncallapply
オブジェクトの構成と継承
明示的な関数ベースの委任はJavaScriptの合成カバーしますが、暗黙的な委任は、たとえば、オブジェクトに関連しているが直接所有されていないメソッドを見つけるために、プロトタイプチェーンがウォークされるたびにすでに発生します。メソッドが見つかると、このオブジェクトのコンテキスト内で呼び出されます。したがって、JavaScriptでの継承は、コンストラクター関数のプロトタイププロパティにバインドされた委任自動化によってカバーされます。

その他

JSはゼロインデックス言語です。

実行時環境
JavaScriptは通常、ランタイム環境(Webブラウザーなど)に依存して、スクリプトが環境(WebページDOMなどと対話できるオブジェクトとメソッドを提供します。これらの環境はシングルスレッドです。 JavaScriptはまた、ランタイム環境に依存して、スクリプト(HTML <script>要素など)をインクルード/インポートする機能を提供します。これ自体は言語機能ではありませんが、ほとんどのJavaScript実装で一般的です。 JavaScriptは、キューからのメッセージ一度に1つずつ処理します。 JavaScriptは、新しいメッセージごとに関連付けられ関数を呼び出し、関数の引数を使用して呼び出しスタックフレームを作成しますおよびローカル変数呼び出しスタックは、関数のニーズに基づいて縮小および拡大します。関数の完了時に呼び出しスタックが空になると、JavaScriptはキュー内の次のメッセージに進みます。これはイベントループと呼ばれ、次のメッセージが考慮される前に各メッセージが完全に処理されるため、「完了まで実行」と呼ばれます。ただし、言語の同時実行モデルは、イベントループを非ブロッキングとして記述します。プログラムの入出力は、イベントコールバック関数を使用して実行されますこれは、たとえば、JavaScriptがデータベースクエリが情報を返すのを待っている間にマウスクリックを処理できることを意味します。[67]
可変個引数関数
無制限の数のパラメーターを関数に渡すことができます。関数は、仮パラメーターおよびローカルargumentsオブジェクトを介してそれらにアクセスできます。メソッドを使用して可変個引数関数を作成することもできbindます。
配列とオブジェクトのリテラル
多くのスクリプト言語と同様に、配列とオブジェクト(他の言語の連想配列)はそれぞれ簡潔なショートカット構文で作成できます。実際、これらのリテラルJSONデータ形式の基礎を形成します。
正規表現
JavaScriptは、Perlと同様の方法で正規表現もサポートします。これにより、組み込みの文字列関数よりも高度なテキスト操作用の簡潔で強力な構文が提供されます。[68]
約束
JavaScriptはpromiseもサポートしています、非同期操作を処理する方法です。 Promiseを処理するための多くの機能へのアクセスを提供し、それらの処理方法を定義する組み込みのPromiseオブジェクトがあります。これにより、ハンドラーを非同期アクションの最終的な成功値または失敗理由に関連付けることができます。これにより、非同期メソッドは同期メソッドのように値を返すことができます。非同期メソッドは、最終値をすぐに返すのではなく、将来のある時点で値を提供するという約束を返します。最近、JavaScript仕様にコンビネータメソッドが導入されました。これにより、開発者は複数のJavaScript Promiseを組み合わせて、さまざまなシナリオに基づいて操作を実行できます。導入されたメソッドは、Promise.race、Promise.all、Promise.allSettled、およびPromise.anyです。

ベンダー固有の拡張機能

歴史的に、一部のJavaScriptエンジンは、次の非標準機能をサポートしていました。

  • 条件catch節(Javaなど)
  • 配列内包表記とジェネレータ式(Pythonなど)
  • 簡潔な関数式(function(args) expr;この実験的な構文は矢印関数よりも古い)
  • ECMAScript for XML(E4X)、ECMAScriptにネイティブXMLサポートを追加する拡張機能(バージョン21以降のFirefoxではサポートされていません[69]

構文

簡単な例

変数JavaScriptでは、いずれかを使用して定義することができvar[70] let[71]又はconst[72]のキーワードを。

// `x`という名前の関数スコープ変数を宣言し、
//特別な値` undefined`を
暗黙的に割り当てます。値のない変数は//
自動的に未定義に設定されます。var  x ;

//変数は手動ので、同じようundefined` `に設定することができます
のvar  x2は 。= 未定義

// `y`という名前のブロックスコープ変数を宣言し、それを
//` undefined`に
暗黙的に設定します。`let`キーワードECMAScriptの2015年に導入されたのlet  Y ;

// `z`という名前のブロックスコープの再割り当て不可能な変数を宣言し、
//文字列リテラルに設定します。`const`キーワードはECMAScript2015でも導入され、
//明示的に割り当てる必要があります。

//キーワード `const`は定数を意味します。したがって
、値が` constant`
であるため、変数を//再割り当てすることはできませんconst  z  =  "この値は再割り当てできません!" ;

// `myNumber`という名前の変数を宣言し、それに数値リテラル(値
//` 2`)を
割り当てます。聞かせて myNumber  =  2 ;

// `myNumber`を再割り当てし、文字列リテラル(値` "foo" `)に設定します。
// JavaScriptは動的に型付けされた言語なので、これは合法です。
myNumber  =  "foo" ;

上記の例コメント注意してください。これらのコメントの前には2つのスラッシュが付いています

JavaScriptには組み込みの入出力機能はありませんランタイム環境がそれを提供します。エディション5.1のECMAScript仕様には、次のように記載されています。[73]

実際、この仕様には、外部データの入力または計算結果の出力に関する規定はありません。

ただし、ほとんどのランタイム環境には、出力の印刷に使用できるconsoleオブジェクト[74]があります。JavaScriptのミニマリストHelloWorldプログラム次のとおりです。

コンソールlog "Hello World!" );

単純な再帰関数:

関数 階乗n  { 
    if  n  ===  0 
        return  1 ;  // 0!= 1

     n  * 階乗n  -  1 );を
返します。}

階乗3 );  // 6を返します

匿名関数(またはラムダ):

関数 カウンター() { 
    let  count  =  0 ;

    return  function () { 
        return  ++ count ; 
    }; 
}

聞かせて 閉鎖 = カウンタ(); 
閉鎖();  // 1つの
クロージャーを返します();  // 2つの
クロージャーを返します();  // 3を返します

この例は、JavaScriptで、関数クロージャが参照によって非ローカル変数をキャプチャすることを示しています。

矢印関数は、第6版-ECMAScript2015で最初に導入されましたJavaScriptで関数を書くための構文を短くします。矢印関数は本質的に匿名です。それらの作成後にそれらを呼び出すためにそれらを参照するために変数が必要です。

矢印関数の例:

//矢印関数を使用すると、 `function`キーワードを省略できます。
//ここで、 `long_example`は無名関数の値を指します。
CONST  long_example  =  INPUT1  INPUT2  =>  {
    コンソールlog "Hello、World!" ); 
    const  output  =  input1  +  input2 ;

     出力を返す; 
};

//何の括弧がない場合は、矢印の機能は、単に表現を返す
//をだからここにそれの(INPUT1 + INPUT2)
のconst  short_example  =  INPUT1  INPUT2  =>  INPUT1  + 入力2 

long_example 2  3 )。 //「Hello、World!」を出力します 戻る5 
short_example 2  5 )。  // 7を返します

//矢印関数にパラメータが1つしかない場合は、括弧を削除できます。
const  no_parentheses  =  input  =>  input  +  2 ;

no_parentheses 3 );  // 5を返します

JavaScriptでは、オブジェクトは関数と同じ方法で作成されます。これは関数オブジェクトとして知られています

オブジェクトの例:

関数 Ball r  { 
    this 半径 =  r ;  //「r」引数はボールオブジェクト
    thisに対してローカルです。面積 = 数学PI  *  r  **  2 );  //括弧は何もしませんが明確にします
    
    //オブジェクトには関数( "method")
    thisを含めることができますショー = 関数() { 
        drawCircle 半径)。 //別の関数(円を描く)を参照します
    }; 
}

聞かせて myBall  = 新しい ボール5 )。 //半径
5myBallのボールオブジェクトの新しいインスタンスを作成します半径++ ;  //オブジェクトのプロパティは通常、
myBallの外部から変更できます表示();  //継承された「show」関数を使用する

可変個引数関数のデモンストレーション(arguments特別な変数です):[75]

関数 sum () { 
    let  x  =  0 ;

      iは =  0 ;  I  < 引数長さ;  ++ I 
        X  + = 引数[ I ]。

     xを返す; 
}

1  2 )。 //戻り3
1  2  3 )。 // 6を返します

即時呼び出し関数式は、クロージャを作成するためによく使用されます。クロージャを使用すると、名前空間にプロパティとメソッドを収集し、それらの一部をプライベートにすることができます。

let  counter  =  function () { 
    let  i  =  0 ;  //プライベートプロパティ

    return  {    //パブリックメソッド
        get  function () { 
            alert i ); 
        }、
        set  function value  { 
            i  =  value ; 
        }、
        インクリメント 関数() {
            アラート++ i ); 
        } 
    }; 
})();  //モジュール

カウンターget ();       // 0
カウンターを表示します。セット6 ); 
カウンターインクリメント();  // 7
カウンターを表示します。インクリメント();  // 8を表示

JavaScriptでのモジュールのエクスポートとインポート[76]

エクスポート例:

/ * mymodule.js * / 
//この関数はプライベートのまま、それがエクスポートされていないとして、
LETの  =  B => {返す+のBを}   
       


//変数を
エクスポートする exportlet  name  =  'Alice' ; 
エクスポート レット 年齢 =  23 ;

//エクスポートという名前の関数
のエクスポート 機能を 追加NUM1  NUM2  {
    戻り NUM1  +  NUM2 
}

//エクスポートクラス
輸出 クラス 乗算 {
    コンストラクタNUM1  NUM2  {
        このnum1  =  num1 ; 
        これnum2  =  num2 ; 
    }

    追加() {
        戻り これNUM1  このNUM2を
    } 
}

インポート例:

// 1つのプロパティを
インポートし ますimport {  add  }  from  './ mymodule.js' ;

コンソールログ追加1  2 ))。 // 3

//複数のプロパティを
インポートし ますimport {  name  age  }  from  './ mymodule.js' ; 
コンソールログ名前 年齢); 
///>「アリス」、23歳

//インポートモジュールからのすべてのプロパティ
のインポート * から 」./module.js'
コンソールログ名前 年齢); 
///>「アリス」、23
コンソールログ追加1 2 ))。
// /> 3

より高度な例

このサンプルコードは、さまざまなJavaScript機能を表示します。

/ * 2つの数値の最小公倍数(LCM)を検索します* / 
function  LCMCalculator x  y  {  //コンストラクター関数
    let  checkInt  =  function x  {  //内部関数
        if  x   1  !==  0 
            throw  new  TypeError x  +  "は整数ではありません" );  // var a = mouseX

         xを返す; 
    };
    
    これa  =  checkInt x 
    //セミコロン^^^^はオプションであり、
    これは改行で十分です。b  =  checkInt y ); 
} 
//コンストラクターによって作成されたオブジェクトインスタンスのプロトタイプは、
//そのコンストラクターの「prototype」プロパティです。
LCMCalculator プロトタイプ =  {  //オブジェクトリテラル
    コンストラクタ LCMCalculator  //プロトタイプを再割り当てするときは、コンストラクタプロパティを適切に設定します
    gcd  function () { //最大公約数を計算するメソッド
        //ユークリッドアルゴリズム:
        let  a  =  Math ABS )、B =数学ABS B )、T     

        if  a  <  b  { 
            //変数を交換する
            // t = b; b = a; a = t; 
            [ a  b ]  =  [ b  a ];  //デストラクチャリング割り当て(ES6)を使用してスワップ
        }

        while  b  !==  0  { 
            t  =  b ; 
            b  =  a   b ; 
            a  =  t ; 
        }

        // GCDを計算する必要があるのは1回だけなので、このメソッドを「再定義」します。
        //(実際には再定義ではありません。インスタンス自体で定義されている
        ため
        // this.gcdはLCMCalculator.prototype.gcdではなくこの「再定義」を参照します。//LCMCalculatorオブジェクトのメンバーの場合、これにより誤った結果が生じることに注意してください
        "a"および/または "b"は後で変更されます。)//また、 'gcd' === "gcd"、this ['gcd'] === this.gcd 
        this [ 'gcd' ]  =  function () {
            返します };
        

        返します }、
    

    //オブジェクトプロパティ名は、二重引用符( ")または単一引用符( ')で区切られた文字列で指定できます
    。lcm  function () { 
        //変数名はオブジェクトプロパティと衝突しません。たとえば、| lcm |は| thisではありません。 。LCM | 
        this.a * this.bを| | //使用していないFP精度の問題を回避するためには
        聞かせて LCMを = これ/これGCD ()*B ;    
        
        // lcmを計算する必要があるのは1回だけなので、このメソッドを「再定義」します。
        これlcm  =  function () { 
            return  lcm ; 
        };

         lcmを返す; 
    }、

    toString  function () { 
        return  "LCMCalculator:a ="  +  this a  +  "、b ="  +  this b ; 
    } 
};

//汎用出力関数を定義します;この実装は、Webブラウザの
関数 出力x  {
    ドキュメントに対してのみ機能しますボディappendChild ドキュメントはcreateTextNode X ))。
    ドキュメントボディappendChild ドキュメントのcreateElement 'BR' )); 
}

//注:配列のmap()とforEach()はJavaScript1.6で定義されています。
//ここでは、JavaScriptの固有の機能的性質を示すために使用されています。
[ 
    [ 25  55 ]、
    [ 21  56 ]、
    [ 22  58 ]、
    [ 28  56 ] 
]。map function pair  {  //配列リテラル+マッピング関数
    return  new  LCMCalculator pair [ 0 ]、 pair [ 1 ]); 
})。ソート(( B =>  LCM ()- B LCM ())//ソートこの比較機能を有します。=>は、「矢印関数」と呼ばれる関数の省略形ですforEach printResult );      
    

関数 printResult OBJ  {
    出力OBJ  +  "GCD = "  +  OBJ GCD () +  "、LCM ="  +  OBJ LCM ())。
}

次の出力がブラウザウィンドウに表示されます。

LCMCalculator:a = 28、b = 56、gcd = 28、lcm = 56
LCMCalculator:a = 21、b = 56、gcd = 7、lcm = 168
LCMCalculator:a = 25、b = 55、gcd = 5、lcm = 275
LCMCalculator:a = 22、b = 58、gcd = 2、lcm = 638

セキュリティ

JavaScriptとDOMは、悪意のある作成者がWeb経由でクライアントコンピューター上で実行するスクリプトを配信する可能性を提供します。ブラウザの作成者は、2つの制限を使用してこのリスクを最小限に抑えます。まず、スクリプトは、ファイルの作成などの汎用プログラミングタスクではなく、Web関連のアクションのみを実行できるサンドボックス実行されます。次に、スクリプトは同一生成元ポリシーによって制約されます。あるWebサイトのスクリプトは、別のサイトに送信されたユーザー名、パスワード、Cookieなどの情報にアクセスできません。 JavaScript関連のセキュリティバグのほとんどは、同一生成元ポリシーまたはサンドボックスのいずれかの違反です。

一般的なJavaScriptのサブセット(ADsafe、Secure ECMAScript(SES))があり、特にサードパーティによって作成されたコード(広告など)でより高いレベルのセキュリティを提供します。[77] [78] Closure Toolkitは、サードパーティのJavaScriptとHTMLを安全に埋め込んで分離するためのもう1つのプロジェクトです。[79]

コンテンツセキュリティポリシーは、信頼できるコードのみがWebページで実行されるようにするための主な目的の方法です。

クロスサイトの脆弱性

一般的なJavaScript関連のセキュリティ問題は同一生成元ポリシーの違反であるクロスサイトスクリプティング(XSS)です。 XSSの脆弱性は、攻撃者がオンラインバンキングのWebサイトなどのターゲットWebサイトに、被害者に提示されたWebページに悪意のあるスクリプトを含めることができる場合に発生します。この例のスクリプトは、被害者の権限で銀行アプリケーションにアクセスし、被害者の許可なしに秘密情報を開示したり、送金したりする可能性があります。 XSSの脆弱性の解決策は、信頼できないデータを表示するときは常にHTMLエスケープを使用することです。

一部のブラウザには、攻撃者が悪意のあるスクリプトを含むURLを提供する、反映されたXSS攻撃に対する部分的な保護が含まれています。ただし、これらのブラウザのユーザーでさえ、悪意のあるコードがデータベースに保存されている攻撃など、他のXSS攻撃に対して脆弱です。XSSを完全に防ぐことができるのは、サーバー側でWebアプリケーションを正しく設計することだけです。

XSSの脆弱性は、ブラウザーの作成者による実装ミスが原因で発生する可能性もあります。[80]

もう1つのクロスサイトの脆弱性は、クロスサイトリクエストフォージェリ(CSRF)です。 CSRFでは、攻撃者のサイトのコードが被害者のブラウザをだまして、ユーザーが標的のサイトで意図しないアクションを実行させます(銀行での送金など)。ターゲットサイトがリクエスト認証をCookieのみに依存している場合、攻撃者のサイトのコードから発信されたリクエストは、開始ユーザーと同じ有効なログイン資格情報を保持できます。一般に、CSRFの解決策は、永続的な影響を与える可能性のある要求を認証するために、Cookieだけでなく、非表示のフォームフィールドに認証値を要求することです。 HTTPリファラーヘッダーを確認することも役立ちます。

「JavaScriptハイジャック」は<script>、攻撃者のサイトのタグが、JSONやJavaScriptなどの個人情報を返す被害者のサイトのページを悪用するCSRF攻撃の一種です考えられる解決策は次のとおりです。

  • 個人情報を返す応答には、POSTパラメーターGETパラメーターに認証トークンが必要です。

クライアントへの信頼の置き忘れ

クライアントサーバーアプリケーションの開発者は、信頼できないクライアントが攻撃者の制御下にある可能性があることを認識する必要があります。アプリケーションの作成者は、JavaScriptコードが意図したとおりに(またはまったく)実行されると想定することはできません。これは、コードに埋め込まれた秘密が、断固とした敵によって抽出される可能性があるためです。いくつかの影響は次のとおりです。

  • 生のソースコードをクライアントに送信する必要があるため、Webサイトの作成者はJavaScriptの動作を完全に隠すことはできません。コードすることができる難読化が、難読化をリバースエンジニアリングすることができます。
  • JavaScriptフォームの検証は、セキュリティではなく、ユーザーの利便性のみを提供します。ユーザーが利用規約に同意したことをサイトが確認したり、数字のみを含める必要があるフィールドから無効な文字を除外したりする場合は、クライアントだけでなくサーバーでも行う必要があります。
  • スクリプトは選択的に無効にできるため、画像を右クリックして保存するなどの操作を防ぐためにJavaScriptに依存することはできません。[81]
  • パスワードなどの機密情報は攻撃者によって抽出される可能性があるため、JavaScriptに埋め込むことは非常に悪い習慣と見なされています。[82]

開発者への誤った信頼

npmやBowerなどのパッケージ管理システムはJavaScript開発者に人気があります。このようなシステムにより、開発者は他の開発者のプログラムライブラリに対するプログラムの依存関係を簡単に管理できます。開発者は、ライブラリのメンテナがライブラリを安全で最新の状態に保つと信じていますが、常にそうであるとは限りません。この盲目的な信頼のために脆弱性が発生しました。依存ライブラリには、ライブラリに依存するすべてのプログラムにバグや脆弱性が現れる原因となる新しいリリースが含まれている可能性があります。逆に、ライブラリはパッチが適用されていない状態で、既知の脆弱性が発生する可能性があります。 133kのWebサイトのサンプルを調べて行われた調査では、研究者はWebサイトの37%に少なくとも1つの既知の脆弱性を持つライブラリが含まれていることを発見しました。[83]「各ウェブサイトで使用されている最も古いライブラリバージョンとそのライブラリの利用可能な最新バージョンの間のラグの中央値は、ALEXAで1、177日であり、まだアクティブに使用されている一部のライブラリの開発は数年前に中止されました。」[83]別の可能性は、ライブラリのメンテナがライブラリを完全に削除する可能性があることです。これは、2016年3月にAzerKoçuluがnpmからリポジトリを削除したときに発生しましたこれにより、彼の図書館に依存する何万ものプログラムやウェブサイトが壊れました。[84] [85]

ブラウザとプラグインのコーディングエラー

JavaScriptは、さまざまなブラウザ機能へのインターフェイスを提供します。その一部には、バッファオーバーフローなどの欠陥がある可能性がありますこれらの欠陥により、攻撃者はユーザーのシステム上で必要なコードを実行するスクリプトを作成できる可能性があります。このコードは、決して別のJavaScriptアプリケーションに限定されるものではありません。たとえば、バッファオーバーランのエクスプロイトにより、攻撃者はスーパーユーザー権限でオペレーティングシステムのAPIにアクセスできるようになる可能性があります。

これらの欠陥は、Firefox、[86] Internet Explorer、[87]、Safariなどの主要なブラウザに影響を及ぼしています[88]

ビデオプレーヤー、Adobe Flash、およびMicrosoft Internet Explorerでデフォルトで有効になっているさまざまなActiveXコントロールなどのプラグインにも、JavaScriptを介して悪用可能な欠陥がある可能性があります(このような欠陥は過去に悪用されています)。[89] [90]

Windows Vistaでは、Microsoftは、制限された特権でInternet Explorerプロセスを実行することにより、バッファオーバーフローなどのバグのリスクを封じ込めようとしました。[91] Google Chromeも同様に、ページレンダラーを独自の「サンドボックス」に限定しています。

サンドボックス実装エラー

Webブラウザーは、サンドボックスの外部でJavaScriptを実行でき、ファイルの作成や削除などに必要な権限があります。このような特権は、Webからのコードに付与されることを意図したものではありません。

WebからJavaScriptに誤って特権を付与することは、Internet Explorer [92]とFirefoxの両方の脆弱性に影響を及ぼしています。[93] Windows XP Service Pack 2では、MicrosoftはInternetExplorerでのJScriptの特権を降格しました。[94]

Microsoft Windowsでは、コンピューターのハードドライブ上のJavaScriptソースファイルを、サンドボックス化されていない汎用プログラムとして起動できます(Windows Script Hostを参照)。これにより、JavaScript(VBScriptなど)は理論的に実行可能なトロイの木馬のベクトルになりますが、JavaScriptのトロイの木馬は実際には一般的ではありません。[95] [検証に失敗しました]

ハードウェアの脆弱性

2015年に、JavaScriptベースのロウハンマー攻撃の概念実証の実装がセキュリティ研究者による論文で説明されました。[96] [97] [98] [99]

2017年には、ブラウザを介したJavaScriptベースの攻撃が実証され、ASLRをバイパスする可能性がありましたこれは「ASLR⊕Cache」またはAnCと呼ばれます。[100] [101]

2018年に、Intelおよびその他のプロセッサでの投機的実行に対するSpectre攻撃を発表した論文には、JavaScriptの実装が含まれていました。[102]

開発ツール

重要なツールは言語とともに進化してきました。

関連技術

Java

よくある誤解は、JavaScriptがJavaに類似しているか、密接に関連しているというものです。どちらもCのような構文を持っていることは事実です(C言語が最も直接的な共通の祖先言語です)。また、どちらも通常はサンドボックス化されており(ブラウザー内で使用する場合)、JavaScriptはJavaの構文と標準ライブラリを念頭に置いて設計されています。特に、すべてのJavaキーワードは元のJavaScriptで予約されており、JavaScriptの標準ライブラリはJavaの命名規則に従い、JavaScriptMathDateオブジェクトはJava 1.0 [105]のクラスに基づいていますが、類似点はそこで終わります。

JavaとJavaScriptはどちらも1995年に最初に登場しましたが、JavaはSunMicrosystemsのJamesGoslingによって開発され、JavaScriptはNetscapeCommunicationsのBrendanEichによって開発されました

2つの言語の違いは、類似点よりも顕著です。Javaには静的型付けがありますが、JavaScriptの型付けは動的です。Javaはコンパイルされたバイトコードからロードされますが、JavaScriptは人間が読めるソースコードとしてロードされます。Javaのオブジェクトはクラスベースですが、JavaScriptのオブジェクトはプロトタイプベースです。最後に、JavaはJava 8まで関数型プログラミングをサポートしていませんでしたが、JavaScriptは最初からサポートしており、Schemeの影響を受けています

JSON

JSON(JavaScript Object Notation)は、JavaScriptのオブジェクトリテラル構文のサブセットとして定義される汎用のデータ交換形式です。

WebAssembly

2017年以降、WebブラウザーはWebAssemblyをサポートしています。これは、JavaScriptエンジンWebページスクリプトのパフォーマンスが重要な部分をネイティブ速度に近い速度で実行できるようにするバイナリ形式です[106] WebAssemblyコードは、通常のJavaScriptコードと同じサンドボックスで実行されます。

asm.jsは、WebAssemblyの前身として機能したJavaScriptのサブセットです。[107]

トランスパイラー

JavaScriptはWebの主要なクライアント側言語であり、多くのWebサイトはスクリプトを多用します。したがって、トランスパイラーは、他の言語で記述されたコードを変換するために作成されており、開発プロセスを支援することができます。[37]

参考文献

  1. ^ a b JavaScriptを発表するプレスリリース、「NetscapeとSunがJavaScriptを発表」、PR Newswire、1995年12月4日
  2. ^ 「ECMAScript®2021言語仕様」2021年6月2021年7月27日取得
  3. ^ https://tc39.es/ecma262/ ; 取得:2021年7月27日; 発行日:2021年7月22日。
  4. ^ "nodejs / node-eps"GitHub2020-08-29にオリジナルからアーカイブされました201875日取得
  5. ^ a b Seibel、Peter(2009年9月16日)。仕事中のコーダー:プログラミングの技術についての考察ISBN 97814302194842020年12月24日にオリジナルからアーカイブされました2018年12月25日取得Eich:Netscapeでの当面の懸念は、Javaのように見える必要があるということでした。
  6. ^ bはCのDのE "はJavaScriptが作成された方法第4章"Speakingjs.com2020-02-27にオリジナルからアーカイブされました20171121日取得
  7. ^ https://brendaneich.com/2008/04/popularity/
  8. ^ 「ブレンダンアイク:JavaScriptの紹介、JSConf2010」YouTubeNS。22メートル。2020年8月29日にオリジナルからアーカイブされました2019年11月25日取得Eich:「機能」、8文字、私はAWKの影響を受けました。
  9. ^ アイク、ブレンダン(1998)。"序文"。グッドマン、ダニー(編)。JavaScriptバイブル(第3版)。ジョンワイリー&サンズISBN 0-7645-3188-3LCCN  97078208OCLC  38888873OL  712205M
  10. ^ 「JavaScript」Dictionary.com2021年8月9日にオリジナルからアーカイブされました2021年8月9日取得
  11. ^ 「ECMAScript®2020言語仕様」2020-05-08にオリジナルからアーカイブされました202058日取得
  12. ^ フラナガン、デビッド。JavaScript-決定的なガイド(6版)。NS。1. JavaScriptは、すべてのWeb開発者が学ばなければならない3つのテクノロジーの一部です。Webページのコンテンツを指定するHTML、Webページの表示を指定するCSS、およびWebページの動作を指定するJavaScriptです。
  13. ^ a b "Webサイトでのクライアント側プログラミング言語としてのJavaScriptの使用統計"w3techs.com2021-08-13にオリジナルからアーカイブされました2021-04-09を取得
  14. ^ bはCのD 「のウェブサイトのためのJavaScriptライブラリの利用統計」w3techs.com2018-09-23にオリジナルからアーカイブされました2021-04-09を取得
  15. ^ 「ブルームバーグゲームチェンジャー:マークアンドリーセン」ブルームバーグ。2011年3月17日。2012年5月16日のオリジナルからアーカイブ2011年12月7日取得
  16. ^ エンツァー、ラリー(2018年8月31日)。「Webブラウザの進化」モンマスWeb開発者2018年8月31日にオリジナルからアーカイブされまし2018年8月31日取得
  17. ^ 「TechVision:ネットの革新者:ブレンダンアイクとJavaScript」2008年2月8日にオリジナルからアーカイブされまし
  18. ^ フィンJS(2016年6月17日)、ブレンダン・アイク-ブレイブのCEOアーカイブ2019年2月10日に元から取得し、年2月7、 2018年
  19. ^ a b 「第5章標準化:ECMAScript」Speakingjs.com 2021年11月1日取得
  20. ^ a b チャンピオン、スティーブ(2001年4月6日)。「JavaScript、どうやってここにたどり着いたの?」oreilly.com2016年7月19日にオリジナルからアーカイブされまし2016年7月16日取得
  21. ^ 「MicrosoftInternetExplorer3.0ベータ版が利用可能になりました」microsoft.comマイクロソフト。1996年5月29日。2020年11月24日のオリジナルからアーカイブ2016年7月16日取得
  22. ^ McCracken、ハリー(2010年9月16日)。ベストのInternet Explorerで表示「の歓迎されないリターン『technologizer.com2018年6月23日にオリジナルからアーカイブされました2016年7月16日取得
  23. ^ ベイカー、ローレン(2004年11月24日)。「MozillaFirefoxインターネットブラウザの市場シェアは7.4%に上昇」検索エンジンジャーナル2021年5月7日にオリジナルからアーカイブされました2021年5月8日取得
  24. ^ ウェーバー、ティム(2005年5月9日)。「ソフトウェアの巨人マイクロソフトへの攻撃」BBCニュース2017年9月25日にオリジナルからアーカイブされまし
  25. ^ 「ビッグブラウザの比較テスト:Internet ExplorerとFirefox、Opera、Safari、Chrome」PCゲームハードウェアComputec Media AG 2009年7月3日。2012年5月1日のオリジナルからアーカイブ2010年6月28日取得
  26. ^ パーディ、ケビン(2009年6月11日)。「LifehackerSpeedTests:Safari 4、Chrome2」ライフハッカー2021年4月14日にオリジナルからアーカイブされました2021年5月8日取得
  27. ^ 「TraceMonkey:JavaScript Lightspeed、BrendanEichのブログ」2015年12月4日にオリジナルからアーカイブされました2020年7月22日取得
  28. ^ 「Mozillaは尋ねます、「私たちはもう速いですか?有線2018年6月22日にオリジナルからアーカイブされました2019年1月18日取得
  29. ^ 「ECMAScript6:新機能:概要と比較」es6-features.org2018年3月18日にオリジナルからアーカイブされました2018年3月19日取得
  30. ^ Professional Node.js: ウェイバックマシンアーカイブされたJavaScriptベースのスケーラブルソフトウェアの構築2017-03-24、John Wiley&Sons、2012年10月1日
  31. ^ Sams Teach Yourself Node.jsを24時間で アーカイブ2017-03-23、 Wayback Machine、Sams Publishing、2012年9月5日
  32. ^ ロートン、ジョージ(2018年7月19日)。「npmとNodeの成功の背後にある秘密の歴史」TheServerSide2021年8月2日にオリジナルからアーカイブされました2021年8月2日取得
  33. ^ ブラウン、ポール(2017年1月13日)。「一般教書演説:npm」Linux.com2021年8月2日にオリジナルからアーカイブされました2021年8月2日取得
  34. ^ a b ブランスクーム、メアリー(2016-05-04)。「JavaScript標準は年間リリーススケジュールに移行します。ES16の新機能は次のとおりです」新しいスタック2021-01-16にオリジナルからアーカイブされました2021-01-15を取得
  35. ^ 「TC39プロセス」tc39.esEcmaインターナショナル。2021-02-07にオリジナルからアーカイブされました2021-01-15を取得
  36. ^ 「ECMAScriptの提案」TC39。2020年12月4日にオリジナルからアーカイブされました2021-01-15を取得
  37. ^ a b アシュケナス、ジェレミー「JSにコンパイルされる言語のリスト」GitHub2020年1月31日にオリジナルからアーカイブされました2020年2月6日取得
  38. ^ 「米国商標シリアル番号75026640」米国特許商標庁2021-07-13にオリジナルからアーカイブされました2021-05-08を取得しました
  39. ^ 「法的通知」オラクル株式会社2021-06-05にオリジナルからアーカイブされました2021-05-08を取得しました
  40. ^ 「バニラJS」vanilla-js.com2020年6月16日にオリジナルからアーカイブされました2020年6月17日取得
  41. ^ 「サーバーサイドJavaScriptガイド」オラクル株式会社1998年12月11日。2021年3月11日のオリジナルからアーカイブ2021年5月8日取得
  42. ^ クリニック、アンドリュー(2000年7月14日)。「JScript.NETの紹介」Microsoft DeveloperNetworkマイクロソフト。2017年11月10日にオリジナルからアーカイブされました2018年4月10日取得[S] 1996年にJScriptバージョン1.0が導入されて以来、サーバー、特にActive Server Pages(ASP)でのJScriptの使用が着実に増加しています。
  43. ^ a b Mahemoff、Michael(2009年12月17日)。「サーバーサイドJavaScript、復讐に戻る」readwrite.com2016年6月17日にオリジナルからアーカイブされました2016年7月16日取得
  44. ^ 「JavaScriptforAcrobat」2009年8月7日にオリジナルからアーカイブされました2009年8月18日取得
  45. ^ 「質問への回答:「GNOME用のアプリを開発するにはどうすればよいですか?" "2013-02-11にオリジナルからアーカイブされました取得した2013年2月7日を
  46. ^ 「Tessel2 ... Node.JSのすべてのライブラリを活用して、Tesselを使用して数分で便利なデバイスを作成します」2021-05-26にオリジナルからアーカイブされました2021-05-08を取得しました
  47. ^ 「Node.jsラズベリーパイGPIOの紹介」2021-08-13にオリジナルからアーカイブされました20205月3取得
  48. ^ 「Espruino-マイクロコントローラー用JavaScript」2020-05-01にオリジナルからアーカイブされました20205月3取得
  49. ^ フラナガン、デビッド(2006年8月17日)。JavaScript:決定的なガイド:決定的なガイド「O'ReillyMedia、Inc。」。NS。16. ISBN 978-0-596-55447-72020年8月1日にオリジナルからアーカイブされました2019年3月29日取得
  50. ^ B C D 「JavaScriptは、インターネットから一つの画像に癖」DEVコミュニティ2019年10月28日にオリジナルからアーカイブされました2019年10月28日取得
  51. ^ 「ワット」www.destroyallsoftware.com2019年10月28日にオリジナルからアーカイブされました2019年10月28日取得
  52. ^ 「JavaScriptのデータ型とデータ構造-JavaScript | MDN」Developer.mozilla.org2017年2月16日。2017年3月14日のオリジナルからアーカイブ2017年2月24日取得
  53. ^ Flanagan 2006、pp。176–178。
  54. ^ クロックフォード、ダグラス。「JavaScriptのプロトタイプ継承」2013年8月13日にオリジナルからアーカイブされました取得した20年8月2013
  55. ^ 「継承とプロトタイプチェーン」Mozilla DeveloperNetworkMozilla2013年4月25日にオリジナルからアーカイブされました2013年4月6日取得
  56. ^ ハーマン、デビッド(2013)。効果的なJavaScriptアディソン-ウェスリー。NS。83. ISBN 978-0-321-81218-6
  57. ^ Haverbeke、Marijn(2011)。EloquentJavaScriptスターチプレスはありません。pp。95–97。ISBN 978-1-59327-282-1
  58. ^ Katz、Yehuda(2011年8月12日)。「JavaScriptの「プロトタイプ」を理解する」2013年4月5日にオリジナルからアーカイブされました2013年4月6日取得
  59. ^ ハーマン、デビッド(2013)。効果的なJavaScriptアディソン-ウェスリー。pp。125–127。ISBN 978-0-321-81218-6
  60. ^ 「関数-JavaScript」MDN WebDocs2021-10-30を取得しました
  61. ^ 「関数オブジェクトのプロパティ」Es5.github.com。2013年1月28日にオリジナルからアーカイブされました2013年5月26日取得
  62. ^ Flanagan 2006、p。141。
  63. ^ 役割指向プログラミングを一般化のためのJavaScriptの多くの才能はトレイトとミックスインのようなアプローチ アーカイブで2017年10月5日ウェイバックマシン、Peterseliger.blogpsot.de、2014年4月11日。
  64. ^ ウェイバックマシン、2010年にアーカイブされたJavaScriptの特性 2014-07-24
  65. ^ 「ホーム| CocktailJS」Cocktailjs.github.io2017年2月4日にオリジナルからアーカイブされました2017年2月24日取得
  66. ^ アンガスCroll、 JavaScriptのミックスインで新鮮な表情 アーカイブで2020年4月15日ウェイバックマシン2011年5月31日に公開、。
  67. ^ 「並行性モデルとイベントループ」Mozilla DeveloperNetwork2015年9月5日にオリジナルからアーカイブされました2015年8月28日取得
  68. ^ Haverbeke、Marijn(2011)。EloquentJavaScriptスターチプレスはありません。pp。139–149。ISBN 978-1-59327-282-1
  69. ^ 「E4X–廃止されたコンテンツのアーカイブ| MDN」Mozilla DeveloperNetworkMozillaFoundation。2014年2月14日。2014年7月24日のオリジナルからアーカイブ2014年7月13日取得
  70. ^ "var – JavaScript –MDN"Mozillaの開発者向けネットワーク2012年12月23日にオリジナルからアーカイブされました2012年12月22日取得
  71. ^ 「レット」MDNWebドキュメントMozilla。2019年5月28日にオリジナルからアーカイブされました2018年6月27日取得
  72. ^ "const"MDNWebドキュメントMozilla。2018年6月28日にオリジナルからアーカイブされました2018年6月27日取得
  73. ^ 「ECMAScript言語仕様–ECMA-262エディション5.1」EcmaInternational2012年11月26日にオリジナルからアーカイブされました2012年12月22日取得
  74. ^ 「コンソール」Mozilla DeveloperNetworkMozilla2013年2月28日にオリジナルからアーカイブされました2013年4月6日取得
  75. ^ 「引数」Mozilla DeveloperNetworkMozilla2013年4月13日にオリジナルからアーカイブされました2013年4月6日取得
  76. ^ 「javascriptのモジュールのインポートとエクスポート」Learnersbucket.com2019年4月23日にオリジナルからアーカイブされました2019年4月23日取得
  77. ^ 「JavaScriptを広告に対して安全にする」ADsafe。2021-07-06にオリジナルからアーカイブされました2021-05-08を取得しました
  78. ^ 「セキュアECMAスクリプト(SES)」2013年5月15日にオリジナルからアーカイブされました2013年5月26日取得
  79. ^ 「GoogleCajaプロジェクト」Google2021-01-22にオリジナルからアーカイブされました2021-07-09を取得
  80. ^ 「Mozillaクロスサイトスクリプティングの脆弱性が報告および修正されました-MozillaZineトークバック」Mozillazine.org2011年8月22日にオリジナルからアーカイブされました2017年2月24日取得
  81. ^ 「「保護」を右クリックしますか?それを忘れてください」6月17日、2008年ISSN 1797年から1993年2011年8月9日にオリジナルからアーカイブされまし2008年6月17日取得  引用ジャーナルには|journal=ヘルプが必要です
  82. ^ Rehorik、1月「JavaScriptに機密データを入れてはいけない理由」ServiceObjectsブログServiceObjects。2019年6月3日にオリジナルからアーカイブされました2019年6月3日取得
  83. ^ a b Lauinger、Tobias; シャアバーン、アブデルベリ; Arshad、Sajjad; ロバートソン、ウィリアム; ウィルソン、クリスト; キルダ、エンギン(2016年12月21日)。「あなたは私に依存してはならない:Web上の古いJavaScriptライブラリの使用を分析する」(PDF)Proceedings2017ネットワークおよび分散システムセキュリティシンポジウムarXiv1811.00918土井10.14722 /ndss.2017.23414ISBN  978-1-891562-46-4S2CID  178857202017年3月29日にオリジナル (PDF)からアーカイブされまし2017年2月22日取得
  84. ^ コリンズ、キース(2016年3月27日)。「あるプログラマーが小さなコードを削除してインターネットを壊した方法」クォーツ2017年2月22日にオリジナルからアーカイブされました2017年2月22日取得
  85. ^ SCマガジン英国、「インターネット休憩」は削除コードの開発者の11行 アーカイブで2017年2月23日、ウェイバックマシン
  86. ^ Mozilla Corporation、 crypto.signText()のバッファオーバーフロー ウェイバックマシン20146月4日にアーカイブ
  87. ^ フェスタ、ポール(1998年8月19日)。「IEのバッファオーバーフローのバグ」CNET2002年12月25日にオリジナルからアーカイブされまし
  88. ^ SecurityTracker.com、 Apple Safari JavaScriptバッファオーバーフローにより、リモートユーザーが任意のコードを実行し、HTTPリダイレクトバグにより、リモートユーザー ウェイバックマシンアーカイブされたファイルにアクセスできるようになる2010-02-18
  89. ^ 情報SecurityFocus、マイクロソフトWebViewFolderIcon ActiveXコントロールのバッファオーバーフローの脆弱性 アーカイブ2011-08-22でWebCite
  90. ^ 融合当局、のMacromedia Flash ActiveXのバッファオーバーフローの アーカイブで2011年8月13日、ウェイバックマシン
  91. ^ 「VistaIE7の保護モード–IEBlog」Blogs.msdn.com2006年2月9日。2010年1月23日のオリジナルからアーカイブ2017年2月24日取得
  92. ^ US CERT、脆弱性メモVU#713878:Microsoft Internet Explorerは、リダイレクトされたフレームのソースを適切に検証しません 。WaybackMachineアーカイブされた2009-10-30
  93. ^ Mozilla Foundationは、 Mozilla Foundationはセキュリティアドバイザリは、2005から41:DOMプロパティを経由して権限昇格が優先されます アーカイブで2014年6月4日のウェイバックマシン
  94. ^ Andersen、Starr(2004-08-09)。「パート5:強化されたブラウジングセキュリティ」TechNetMicrosoftDocsWindows XP Service Pack2の機能の変更2021-10-20を取得
  95. ^ まれJavaScriptのトロイの木馬の一例として、シマンテック社、参照JS.Seeker.K アーカイブで2011-08-22をWebCite
  96. ^ Gruss、Daniel; モーリス、クレメンタイン; マンガード、ステファン(2015年7月24日)。「Rowhammer.js:JavaScriptでのリモートソフトウェアによるフォールト攻撃」。arXiv1507.06955 [ cs.CR ]。
  97. ^ Jean-Pharuns、Alix(2015年7月30日)。「Rowhammer.jsは私が今まで見た中で最も独創的なハックです」マザーボード2018年1月27日にオリジナルからアーカイブされました2018年1月26日取得
  98. ^ Goodin、Dan(2015年8月4日)。「PCを攻撃するためのDRAM「ビットフリッピング」エクスプロイト:JavaScriptを追加するだけ」ArsTechnica2018年1月27日にオリジナルからアーカイブされました2018年1月26日取得
  99. ^ Auerbach、David(2015年7月28日)。「ロウハンマーセキュリティエクスプロイト:新しいセキュリティ攻撃が本当に恐ろしい理由」slate.com2015年7月30日にオリジナルからアーカイブされました2015年7月29日取得
  100. ^ AnC Archived 2017-03-16 at the Wayback Machine VUSec、2017
  101. ^ 新しいASLRを破壊するJavaScriptは、ドライブバイエクスプロイトをはるかに厄介なものにしようとしています。 アーカイブ2017-03-16、 Wayback Machine Ars Technica、2017
  102. ^ ウェイバックマシンスペクターアタックアーカイブされたスペクターアタック 2018-01-03
  103. ^ 「Benchmark.js」ベンチマークjs.com2016年12月19日にオリジナルからアーカイブされました201611月6日取得
  104. ^ JSBEN.CH。「JavaScript用JSBEN.CHパフォーマンスベンチマークプレイグラウンド」jsben.ch2021-02-27にオリジナルからアーカイブされました2021813日取得
  105. ^ アイク、ブレンダン(2008年4月3日)。「人気」2011年7月3日にオリジナルからアーカイブされました2012年1月19日取得
  106. ^ 「エッジブラウザがWebAssemblyを「オン」に切り替える-VisualStudioMagazine」Visual StudioMagazine2018-02-10にオリジナルからアーカイブされました2018年2月9日取得
  107. ^ 「よくある質問」asm.js。2014年6月4日にオリジナルからアーカイブされました2014年4月13日取得

さらに読む

  • フラナガン、デビッド。JavaScript:決定的なガイド第7版。カリフォルニア州セバストポル:オライリー、2020年。
  • Haverbeke、Marijn。EloquentJavaScript第3版。ノースターチプレス、2018年。472ページ。ISBN 978から1593279509(ダウンロード) 
  • ザカス、ニコラス。オブジェクト指向JavaScriptの原則、第1版。ノースターチプレス、2014年。120ページ。ISBN 978から1593275402 

外部リンク

この記事を聞く48
音声ウィキペディアアイコン
このオーディオファイル2013年8月20日付けのこの記事の改訂版から作成されたものであり、その後の編集は反映されていません。 (2013-08-20