JavaScript ソースコードのスクリーンショット | |
| パラダイム | マルチパラダイム:イベント駆動型、関数型、命令型、手続き型、オブジェクト指向 |
|---|---|
| デザイン: | 最初はNetscapeのBrendan Eich氏、他の人たちもECMAScript標準に貢献した。 |
| 初登場 | 1995年12月4日[1] |
| 安定リリース | ECMAScript 2024 [2]
/ 2024年6月 |
| プレビューリリース | ECMAScript 2025 [3]
/ 2024年3月27日 |
| タイピングの規律 | ダイナミック、弱い、アヒル |
| ファイル名拡張子 |
|
| Webサイト | ecma-international.org/publications-and-standards/standards/ecma-262/ |
| 主な実装 | |
| V8、JavaScriptCore、SpiderMonkey、Chakra | |
| 影響を受けた | |
| Java、[5] [6] Scheme、[6] Self、[7] AWK、[8] HyperTalk [9] | |
| 影響を受けた | |
| ActionScript、ArkTS、AssemblyScript、CoffeeScript、Dart、Haxe、JS++、Opa、TypeScript | |
JavaScript(/ ˈ dʒ ɑː v ə s k r ɪ p t /)は、しばしばJSと略され、HTMLやCSSと並んでWebのコアテクノロジーであるプログラミング言語です。ウェブサイトの99%は、ウェブページの動作のためにクライアント側でJavaScriptを使用しています。[10]
Web ブラウザには、クライアントコードを実行する専用のJavaScript エンジンがあります。これらのエンジンは、一部のサーバーやさまざまなアプリでも利用されています。ブラウザ以外での使用に最もよく使用されるランタイム システムはNode.jsです。
JavaScriptは、 ECMAScript標準に準拠した、高水準でジャストインタイムコンパイル言語です。[11]動的型付け、プロトタイプベースのオブジェクト指向、第一級関数を備えています。また、マルチパラダイムで、イベント駆動型、関数型、命令型プログラミングスタイルをサポートしています。テキスト、日付、正規表現、標準データ構造、ドキュメントオブジェクトモデル(DOM) を操作するためのアプリケーションプログラミングインターフェイス(API)を備えています。
ECMAScript 標準には、ネットワーク、ストレージ、グラフィックス機能などの入出力(I/O) は含まれていません。実際には、Web ブラウザーまたはその他のランタイム システムが I/O 用の JavaScript API を提供します。
Javaと JavaScript は名前、構文、それぞれの標準ライブラリが似ていますが、2 つの言語は別個のものであり、設計は大きく異なります。
歴史
Netscape での創造
グラフィカルユーザーインターフェイスを備えた最初の人気ウェブブラウザであるMosaicは、1993年にリリースされました。技術者以外の人でもアクセスでき、初期のワールドワイドウェブの急速な成長に大きな役割を果たしました。[12]その後、Mosaicの主任開発者はNetscape社を設立し、1994年にさらに洗練されたブラウザであるNetscape Navigatorをリリースしました。これはすぐに最も使用されるブラウザになりました。[13]
ウェブの形成期には、ウェブページは静的なものしかなく、ブラウザにページが読み込まれた後の動的な動作はできませんでした。ウェブ開発が盛んだった時代には、この制限を取り除きたいという要望があり、1995 年に Netscape はNavigator にプログラミング言語を追加することを決定しました。Netscape はこれを実現するために 2 つの方法を採用しました。Sun Microsystemsと協力し、 Java言語を組み込み、 Brendan Eich を雇ってScheme言語を組み込みました。[6]
その目標は「一般大衆のための言語」[14] 、 「プログラマー以外の人が動的でインタラクティブなWebサイトを作成できるようにする」ことだった。[15] Netscapeの経営陣はすぐに、Schemeや他の既存のスクリプト言語に似ていないJavaに似た構文を持つ新しい言語をアイヒが考案するのが最善の選択肢であると判断した。[5] [6]新しい言語とそのインタープリタ実装は、1995年9月にNavigatorベータ版の一部として最初に出荷されたときはLiveScriptと呼ばれていたが、12月の正式リリースではJavaScriptに名前が変更された。[6] [1] [16] [17]
JavaScriptという名前を選んだことで、それがJavaと直接関係しているという誤解が生じ、混乱を招いた。当時はドットコムブームが始まっており、Javaは人気の新しい言語だったため、アイヒはJavaScriptという名前はNetscapeのマーケティング戦略だと考えた。[14]
マイクロソフトによる採用
マイクロソフトは1995年にInternet Explorerを発表し、Netscapeとのブラウザ戦争を引き起こした。JavaScriptに関しては、マイクロソフトはJScriptと呼ばれる独自のインタープリターを作成した。[18]
マイクロソフトは1996年に初めてJScriptをリリースし、同時にCSSとHTMLの拡張機能もサポートしました。これらの実装はいずれも、 Netscape Navigatorの対応するものとは著しく異なっていました。[19] [20]これらの違いにより、開発者が両方のブラウザでWebサイトをうまく動作させることが困難になり、「Netscapeで最適」および「Internet Explorerで最適」というロゴが数年間広く使用されることになりました。[19] [21]
JScriptの台頭
ブレンダン・アイクは後にこの時期についてこう語っている。「まだ一種の脇役言語だ。遅いとか、うるさいとか思われている。ポップアップや、古いブラウザの下部にある古いステータスバーのスクロールメッセージを使う人もいる。」[14]
1996 年 11 月、Netscape は、すべてのブラウザ ベンダーが準拠できる標準仕様の出発点として、JavaScript をEcma Internationalに提出しました。これにより、1997 年 6 月に最初のECMAScript言語仕様が正式にリリースされました。
標準化プロセスは数年間継続され、1998年6月にECMAScript 2、1999年12月にECMAScript 3がリリースされました。ECMAScript 4の作業は2000年に始まりました。[18]
しかし、言語を完全に標準化する努力は、ブラウザ市場でマイクロソフトがますます支配的な地位を獲得したことで損なわれました。2000年代初頭までに、Internet Explorerの市場シェアは95%に達しました。[22]これは、 JScriptがWeb上の クライアント側スクリプトの事実上の標準になったことを意味します。
Microsoft は当初、標準化プロセスに参加し、JScript 言語でいくつかの提案を実装しましたが、最終的には ECMA の作業への協力をやめました。そのため、ECMAScript 4 は廃止されました。
成長と標準化
2000年代初頭のInternet Explorerの優位性の間、クライアントサイドスクリプトは停滞していました。2004年にNetscapeの後継者であるMozillaがFirefoxブラウザをリリースすると、状況は変わり始めました。Firefoxは多くの人に好評を博し、Internet Explorerから大きな市場シェアを奪いました。[23]
2005 年、Mozilla は ECMA International に加盟し、ECMAScript for XML (E4X) 標準の作業が開始されました。これにより、Mozilla は、 ECMAScript 4 ドラフトに基づいた ActionScript 3 言語で E4X を実装していたMacromedia (後にAdobe Systemsに買収) と共同で作業することになりました。目標は、ActionScript 3 を新しい ECMAScript 4 として標準化することでした。この目的のため、Adobe Systems はTamarin実装をオープンソースプロジェクトとしてリリースしました。しかし、Tamarin と ActionScript 3 は、確立されたクライアント側スクリプトとは大きく異なっており、Microsoftの協力がなければ、ECMAScript 4 は実現しませんでした。
一方、ECMA の活動とは関係のないオープンソース コミュニティでは、非常に重要な開発が行われていました。2005 年にJesse James Garrett がホワイト ペーパーを公開し、その中でAjaxという用語を作り出し、JavaScript を基盤とする一連のテクノロジについて説明しました。このテクノロジは、ページ全体を再読み込みせずにバックグラウンドでデータを読み込むことができるWeb アプリケーションを作成するためのものです。これが、オープンソース ライブラリとそれを中心に形成されたコミュニティが先頭に立って JavaScript のルネッサンス期を巻き起こしました。jQuery、Prototype、Dojo Toolkit、MooTools など、多くの新しいライブラリが作成されました。
Googleは2008年に競合他社よりも高速なV8 JavaScriptエンジンを搭載したChromeブラウザを発表しました。 [24] [25]重要な革新はジャストインタイムコンパイル(JIT)でした。[26]そのため、他のブラウザベンダーはJITのためにエンジンを全面的に改良する必要がありました。[27]
2008 年 7 月、これらのさまざまな関係者がオスロで会議に集まりました。これにより、2009 年初頭にすべての関連作業を統合して言語を前進させることで最終的に合意に達しました。その結果、2009 年 12 月に ECMAScript 5 標準がリリースされました。
成熟に達する
この言語に関する野心的な作業は数年にわたって続けられ、 2015年にECMAScript 6が公開され、膨大な追加機能と改良点が正式にまとめられました。[28]
2009年にライアン・ダールがNode.jsを開発したことで、ウェブブラウザ以外でのJavaScriptの使用が大幅に増加しました。NodeはV8エンジン、イベントループ、I/O APIを組み合わせて、スタンドアロンのJavaScriptランタイムシステムを提供しています。[29] [30] 2018年現在、Nodeは数百万人の開発者に使用されており、[31] npmは世界で最も多くのモジュールを持つパッケージマネージャです。 [32]
ECMAScriptのドラフト仕様は現在GitHubで公開されており、[33]定期的に毎年スナップショットが公開されてエディションが作成されています。[33]言語の潜在的な改訂は、包括的な提案プロセスを通じて審査されます。[34] [35]現在、開発者はエディション番号の代わりに、今後の機能のステータスを個別に確認しています。[33]
現在のJavaScriptエコシステムには、多くのライブラリやフレームワーク、確立されたプログラミング手法、Webブラウザ以外でのJavaScriptの大幅な使用があります。[17]さらに、シングルページアプリケーションやその他のJavaScriptを多用するWebサイトの台頭により、開発プロセスを支援するためにいくつかのトランスパイラが作成されました。[36]
商標
「JavaScript」は米国オラクル社の商標です。 [37] [38]この商標はもともと1997年5月6日にサン・マイクロシステムズ社に付与され、2009年にオラクル社がサンを買収した際にオラクル社に譲渡されました。[39]
ウェブサイトのクライアント側の使用
JavaScriptはWebのクライアント側 スクリプト言語として最も多く使用されており、 Webサイトの99%がこの目的で使用しています。[10]スクリプトはHTML文書に埋め込まれたり、 HTML文書から取り込まれたりして、 DOMと対話します。
すべての主要なWeb ブラウザには、ユーザーのデバイス上で コードを実行するJavaScript エンジンが組み込まれています。
スクリプト化された動作の例
- AjaxまたはWebSocketを介して、ページを再読み込みせずに新しいWeb ページコンテンツを読み込みます。たとえば、ソーシャル メディアのユーザーは、現在のページを離れることなくメッセージを送受信できます。
- オブジェクトのフェードイン、フェードアウト、サイズ変更、移動などの Web ページのアニメーション。
- ブラウザゲームをプレイしています。
- ストリーミング メディアの再生を制御します。
- ポップアップ広告や警告ボックスを生成します。
- データがWeb サーバーに送信される前に、 Web フォームの入力値を検証します。
- ユーザーの行動に関するデータを記録し、それをサーバーに送信します。Web サイトの所有者は、このデータを分析、広告の追跡、パーソナライゼーションに使用できます。
- ユーザーを別のページにリダイレクトします。
- ストレージまたはIndexedDB標準を介して、ユーザーのデバイスにデータを保存および取得します。
ライブラリとフレームワーク
ウェブサイトの80%以上が、クライアント側スクリプトの一部としてサードパーティのJavaScriptライブラリまたはウェブフレームワークを使用しています。 [40]
jQueryは圧倒的に最も多く使用されています。[40]その他の注目すべきものとしては、Angular、Bootstrap、Lodash、Modernizr、React、Underscore、Vueなどがあります。[40] jQueryとBootstrapなど、複数のオプションを組み合わせて使用することもできます。[41]
しかし、「Vanilla JS」という用語は、ライブラリやフレームワークを一切使用せず、代わりに標準のJavaScript機能に完全に依存するWebサイトを指すために造られました。[42]
その他の用途
JavaScript の使用は、Web ブラウザーのルーツを超えて拡大しています。JavaScriptエンジンは現在、サーバー側のWeb サイトの展開と非ブラウザーアプリケーションの両方で、さまざまな他のソフトウェア システムに組み込まれています。
サーバーサイドJavaScriptの使用を促進する最初の試みは、Netscape Enterprise ServerとMicrosoftのInternet Information Servicesであったが、[43] [44]それらは小さなニッチであった。[45]サーバーサイドの使用は、 Node.jsやその他のアプローチの作成により、2000年代後半に最終的に増加し始めた。[45]
Electron、Cordova、React Nativeなどのアプリケーションフレームワークは、JavaScriptで実装された動作を持つ多くのアプリケーションを作成するために使用されてきました。その他の非ブラウザアプリケーションには、PDFドキュメントのスクリプトをサポートするAdobe Acrobat [46]やJavaScriptで書かれたGNOME Shell拡張機能などがあります。[47]
JavaScriptは、通常Node.jsを活用して、いくつかの組み込みシステムで使用されています。[48] [49] [50]
実行
JavaScript エンジン
JavaScriptエンジンはJavaScriptコードを実行するソフトウェアコンポーネントです。最初のJavaScriptエンジンは単なるインタープリタでしたが、最近の関連するエンジンはすべて、パフォーマンスを向上させるためにジャストインタイムコンパイルを使用しています。[51]
JavaScriptエンジンは通常、ウェブブラウザベンダーによって開発されており、すべての主要ブラウザに搭載されています。ブラウザでは、JavaScriptエンジンはドキュメントオブジェクトモデルとWeb IDLバインディングを介してレンダリングエンジンと連携して動作します。[52]ただし、JavaScriptエンジンの使用はブラウザに限定されません。たとえば、V8エンジンはNode.jsランタイムシステムのコアコンポーネントです。[53]
ECMAScriptはJavaScriptの標準化された仕様である ため、ECMAScriptエンジンはこれらの実装の別名です。WebAssemblyの登場により、一部のエンジンではこのコードを通常のJavaScriptコードと同じサンドボックスで実行できるようになりました。[54] [53]ランタイムシステム
スクリプトが広範な環境と対話できるようにするには、JavaScript エンジンをランタイム システム( Web ブラウザーやスタンドアロン システムなど) 内に埋め込む必要があります。ランタイム システムには、ネットワーク、ストレージ、グラフィックスなどの入出力操作に必要な API が含まれており、スクリプトをインポートする機能も提供されます。
JavaScript はシングルスレッド言語です。ランタイムはキューからのメッセージを1 つずつ処理し、新しいメッセージごとに関連付けられた関数を呼び出して、関数の引数とローカル変数を含むコール スタックフレームを作成します。コール スタックは関数の必要に応じて縮小または拡大します。関数の完了時にコール スタックが空になると、JavaScript はキュー内の次のメッセージに進みます。これはイベント ループと呼ばれ、各メッセージが完全に処理されてから次のメッセージが検討されるため、「完了まで実行する」と説明されています。ただし、この言語の並行性モデルでは、イベント ループは非ブロッキングであると説明されています。つまり、プログラム I/O はイベントとコールバック関数を使用して実行されます。つまり、たとえば、JavaScript はデータベース クエリが情報を返すのを待っている間にマウス クリックを処理できます。[55]
注目すべきスタンドアロン ランタイムは、 Node.js、Deno、Bunです。
特徴
以下の機能は、明示的に指定されていない限り、すべての準拠 ECMAScript 実装に共通です。
命令的で構造化された
JavaScript はCの構造化プログラミング構文の多くをサポートしています(例:文、ループ、文、ループなど)。 部分的な例外が 1 つあり、スコープです。元々 JavaScript には を使用した関数スコープしかありませんでした。ブロックスコープはECMAScript 2015 でキーワードとによって追加されました。C と同様に、JavaScript では式と文を区別します。C との構文上の違いの 1 つは自動セミコロン挿入で、これによりセミコロン (文の終了文字) を省略できます。[56]ifwhileswitchdo whilevarletconst
弱い型付け
JavaScriptは弱い型付けであり、使用される操作に応じて特定の型が暗黙的にキャストされることを意味します。[57]
- 二項
+演算子は、両方のオペランドが数値でない限り、両方のオペランドを文字列に変換します。これは、加算演算子が連結演算子としても機能するためです。 - 二項
-演算子は常に両方のオペランドを数値に変換します - 単項演算子(
+、-)は両方とも常にオペランドを数値にキャストします。
値は次のように文字列に変換されます。[57]
- 文字列はそのまま残されます
- 数値は文字列表現に変換されます
- 配列の要素は文字列に変換され、その後カンマ(
,)で結合されます。 - 他のオブジェクトは、オブジェクトのコンストラクタの名前で
[object Object]ある文字列に変換されます。Object
値は、文字列にキャストしてから文字列を数値にキャストすることで数値にキャストされます。これらのプロセスは、それぞれ文字列キャストと数値キャストのプロトタイプで関数toStringとvalueOf関数を定義することで変更できます。
JavaScriptは、これらの変換の実装方法について、ルールの複雑さが矛盾と誤解される可能性があるとして批判を受けています。[58] [57]たとえば、文字列に数値を追加する場合、連結を実行する前に数値を文字列に変換しますが、文字列から数値を減算する場合は、減算を実行する前に文字列を数値に変換します。
よく言及されるのは、{} + []結果として (数値) になることです0。これは誤解を招きます。 は{}空のオブジェクトではなく空のコードブロックとして解釈され、空の配列は残りの単項演算子によって数値にキャストされます+。式が括弧で囲まれている場合({} + [])、中括弧は空のオブジェクトとして解釈され、式の結果は"[object Object]"予想どおりになります。[57]
動的
タイピング
JavaScriptは他のほとんどのスクリプト言語と同様に動的に型付けされます。型は式ではなく値に関連付けられます。たとえば、最初は数値にバインドされていた変数は、文字列に再割り当てされることがあります。[59] JavaScriptは、ダックタイピングを含む、オブジェクトの型をテストするさまざまな方法をサポートしています。[60]
実行時評価
JavaScript には、eval実行時に文字列として提供されたステートメントを実行できる関数が含まれています。
オブジェクト指向(プロトタイプベース)
JavaScript におけるプロトタイプ継承は、Douglas Crockfordによって次のように説明されています。
プロトタイプオブジェクトを作成し、新しいインスタンスを作成します。JavaScript ではオブジェクトは変更可能なので、新しいインスタンスを拡張して、新しいフィールドとメソッドを追加できます。これらは、さらに新しいオブジェクトのプロトタイプとして機能します。多くの類似したオブジェクトを作成するためにクラスは必要ありません...オブジェクトはオブジェクトを継承します。これ以上にオブジェクト指向的なことがあるでしょうか? [61]
JavaScript では、オブジェクトは連想配列で、プロトタイプが追加されています (下記参照)。各キーはオブジェクトプロパティの名前を提供し、そのような名前を指定する構文にはドット表記 ( obj.x = 10) と角括弧表記 ( obj['x'] = 10) の 2 つの方法があります。プロパティは、実行時に追加、再バインド、または削除できます。オブジェクトのほとんどのプロパティ(およびオブジェクトのプロトタイプ継承チェーンに属するすべてのプロパティ) は、ループを使用して列挙できますfor...in。
プロトタイプ
JavaScriptは、他の多くのオブジェクト指向言語が継承にクラスを使用するのに対し、プロトタイプを使用します。[62] JavaScriptでは、プロトタイプを使用して多くのクラスベースの機能をシミュレートできます。[63]
オブジェクトコンストラクタとしての関数
関数は、通常の役割に加えて、オブジェクト コンストラクターとしても機能します。関数呼び出しの前にnewを付けると、プロトタイプのインスタンスが作成され、コンストラクターからプロパティとメソッド (Objectプロトタイプのプロパティを含む) が継承されます。[64] ECMAScript 5 ではObject.createメソッドが提供されており、プロトタイプから自動的に継承することなく、明示的にインスタンスを作成できますObject(古い環境では、プロトタイプを に割り当てることができますnull)。[65]コンストラクターのprototypeプロパティによって、新しいオブジェクトの内部プロトタイプに使用されるオブジェクトが決まります。コンストラクターとして使用される関数のプロトタイプを変更することで、新しいメソッドを追加できます。 や などの JavaScript の組み込みコンストラクターにArrayもObject、変更可能なプロトタイプがあります。Objectプロトタイプを変更することは可能ですが、JavaScript のほとんどのオブジェクトはプロトタイプからメソッドとプロパティを継承しObject、プロトタイプが変更されることを想定できない可能性があるため、一般的には悪い習慣と見なされています。[66]
メソッドとしての関数
多くのオブジェクト指向言語とは異なり、JavaScript では関数定義とメソッド定義の区別はありません。むしろ、区別は関数呼び出し時に行われます。関数がオブジェクトのメソッドとして呼び出されると、関数のローカルthisキーワードはその呼び出しの間そのオブジェクトにバインドされます。
機能的
JavaScript関数は第一級関数であり、関数はオブジェクトとみなされます。[67]そのため、関数にはやなどのプロパティやメソッドがある場合があります.call()。.bind()[ 68]
語彙の閉鎖
ネストされた関数は、別の関数内で定義された関数です。外側の関数が呼び出されるたびに作成されます。
さらに、各ネストされた関数はレキシカルクロージャを形成します。つまり、外側の関数の実行が終了した後でも、外側の関数のレキシカルスコープ(定数、ローカル変数、引数値を含む)は、各内側の関数オブジェクトの内部状態の一部になります。[69]
匿名関数
JavaScript は匿名関数もサポートしています。
委任型
JavaScript は暗黙的および明示的な委任をサポートします。
役割としての機能(特性とミックスイン)
JavaScriptは、 Traits [71] [72]やMixin [73]のようなRole [70]パターンのさまざまな関数ベースの実装をネイティブにサポートしています。このような関数は、その本体内のキーワードにバインドされた少なくとも1つのメソッドによって追加の動作を定義します。その後、プロトタイプチェーンを介して共有されない追加の動作を特徴とする必要があるオブジェクトを介して、またはオブジェクトにRoleを明示的に委任する必要があります。
thisfunctioncallapply
オブジェクトの構成と継承
明示的な関数ベースの委任は JavaScript の合成をカバーしますが、暗黙的な委任は、たとえば、オブジェクトに関連しているが直接所有されていないメソッドを見つけるためにプロトタイプ チェーンをたどるたびにすでに発生します。メソッドが見つかると、このオブジェクトのコンテキスト内で呼び出されます。したがって、 JavaScript の継承は、コンストラクター関数のプロトタイプ プロパティにバインドされた委任の自動化によってカバーされます。
その他
ゼロベースの番号付け
JavaScript はゼロインデックス言語です。
可変長関数
関数には、不定数のパラメータを渡すことができます。関数は、仮パラメータとローカルオブジェクトを通じて、それらのパラメータにアクセスできますarguments。メソッドを使用して、可変長関数bindを作成することもできます。
配列とオブジェクトリテラル
多くのスクリプト言語と同様に、配列とオブジェクト (他の言語では連想配列) はそれぞれ簡潔なショートカット構文で作成できます。実際、これらのリテラルがJSONデータ形式の基礎を形成します。
正規表現
Perlと同様に、JavaScriptも正規表現をサポートしており、組み込みの文字列関数よりも洗練された簡潔で強力なテキスト操作構文を提供します。[74]
Promise と Async/await
JavaScript は、非同期操作を処理するためのPromiseとAsync/await をサポートしています。[引用が必要]
約束
組み込みの Promise オブジェクトは、Promise を処理し、ハンドラーを非同期アクションの最終結果に関連付ける機能を提供します。最近、JavaScript 仕様にコンビネータ メソッドが導入されました。これにより、開発者は複数の JavaScript Promise を組み合わせて、さまざまなシナリオに基づいて操作を行うことができます。導入されたメソッドは、Promise.race、Promise.all、Promise.allSettled、および Promise.any です。
非同期/待機
async/await を使用すると、非同期の非ブロッキング関数を通常の同期関数と同様の方法で構成できます。非同期の非ブロッキング コードは、従来の同期のブロッキング コードと同様に構造化され、最小限のオーバーヘッドで記述できます。
ベンダー固有の拡張機能
歴史的に、一部のJavaScript エンジンは次のような非標準機能をサポートしていました。
- 条件節
catch(Java など) - 配列の内包表記とジェネレータ式(Python のような)
- 簡潔な関数式(
function(args) exprこの実験的な構文は矢印関数より前からあった) - ECMAScript for XML (E4X) は、ECMAScriptにネイティブXMLサポートを追加する拡張機能です(Firefoxバージョン21以降ではサポートされていません[75])
構文
簡単な例
JavaScriptの変数varは、[76] let[77]またはconst[78]キーワードを使用して定義できます。キーワードなしで定義された変数はグローバルスコープで定義されます。
// `x` という名前の関数スコープの変数を宣言し、
それに暗黙的に特別な値 `undefined` を割り当てます。値のない変数は自動的に
undefinedに設定されます。//
var は一般に悪い習慣と考えられており、let と const が通常は好まれます。var
x ;
// 変数は次のように手動で` undefined` に設定できます。let x2 = undefined ;
// `y` という名前のブロックスコープの変数を宣言し、それを暗黙的に
`undefined` に設定します。`let` キーワードは ECMAScript 2015 で導入されました
。let y ;
// ブロックスコープの再割り当て不可能な変数 `z` を宣言し、それを
文字列リテラルに設定します。`const` キーワードも ECMAScript 2015 で導入され
、明示的に割り当てる必要があります。
// キーワード `const` は定数を意味するため、
値が `constant` であるため、変数を再割り当てすることはできません。const
z = "この値は再割り当てできません! " ;
// グローバルスコープの変数を宣言し、3 を割り当てます。これは一般的に
悪い習慣と考えられており、厳密モードがオンの場合は機能しません
。t = 3 ;
// `myNumber` という名前の変数を宣言し、数値リテラル(値`2`) を割り当てます。let
myNumber = 2 ;
// `myNumber` を再割り当てし、文字列リテラル (値 `"foo"`) に設定します。//
JavaScript は動的型付け言語なので、これは有効です。myNumber
= " foo" ;
上記の例のコメントはすべて 2 つのスラッシュで始まっていることに注意してください。
JavaScript には組み込みの入出力機能はなく、ランタイム環境によって提供されます。ECMAScript 仕様書 5.1 版では、「この仕様では外部データの入力や計算結果の出力については規定されていません」と述べられています。[79]consoleただし、ほとんどのランタイム環境には、出力を印刷するために使用できるオブジェクト
があります。 [80]以下は、コンソール オブジェクトを使用したランタイム環境における JavaScript の最小限の「Hello, World!」プログラムです。
コンソール.log ( "Hello, World!" ) ;
HTML ドキュメントでは、出力には次のようなプログラムが必要です。
// テキスト ノードは、"write" メソッドを使用して作成できます。
// ドキュメントが完全に読み込まれている場合はドキュメントを上書きする可能性があるため、これは好ましくありません。
document . write ( 'foo' );
// 要素も作成できます。まず、DOM 内に要素を作成する必要があります。const
myElem = document . createElement ( ' span' );
// クラスや ID などの属性も設定でき
ますmyElem.classList.add ( ' foo ' ) ; myElem.id = ' bar ' ;
// これを設定すると、タグは次のようになります: `<span class="foo" id="bar" data-attr="baz"></span>`
myElem . setAttribute ( 'data-attr' , 'baz' ); // これは `myElem.dataset.attr = 'baz'` と書くこともできます
//最後に、 HTMLドキュメントの<body>に子要素として追加します。body.appendChild ( myElem );
// 要素は、1 つの要素の場合は querySelector で、複数の要素の場合は querySelectorAll で命令的に取得できます。複数の要素は forEach でループできます
。document . querySelector ( '.class' ); // "class" クラスの最初の要素を選択します。document . querySelector ( '#id' ); // "id" の `id` を持つ最初の要素を選択します。 document . querySelector ( '[data-other]' ); // "data-other" 属性を持つ最初の要素を選択します。document . querySelectorAll ( '.multiple' ); // "multiple" クラスを持つすべての要素の配列のような NodeList を返します。
function factorial ( n ) { // 引数の正当性をチェックします。階乗は正の整数に対して定義されます。if ( isNaN ( n )) { console . error ( "数値以外の引数は許可されていません。" ); return NaN ; // 特別な値: Not a Number } if ( n === 0 ) return 1 ; // 0! = 1 if ( n < 0 ) return undefined ; // 負の数の階乗は定義されていません。if ( n % 1 ) { console . warn ( ` ${ n }は最も近い整数に丸められます。整数以外の場合は、代わりにガンマ関数の使用を検討してください。` ); n = Math . round ( n ); } // 上記のチェックは再帰で繰り返す必要がないため、実際の再帰部分を以下で別途定義します。
// 次の行は階乗を再帰的に計算する関数式です。ES6 で導入された矢印構文を使用します。const
recursivelyCompute = a => a > 1 ? a * recursivelyCompute ( a - 1 ) : 1 ; // 三項演算子 `?` の使用に注意してください。return recursivelyCompute ( n ) ; }
階乗( 3 ); // 6 を返す
匿名関数(またはラムダ):
const counter = function () { let count = 0 ; return function () { return ++ count ; } };
const x = counter (); x (); // 1 を返すx (); // 2 を返すx (); // 3 を返す
この例は、JavaScript では関数クロージャが非ローカル変数を参照によってキャプチャすることを示しています。
アロー関数は、第 6 版 ECMAScript 2015で初めて導入されました。JavaScript で関数を記述するための構文を短縮します。アロー関数は匿名であるため、括弧で囲んですぐに実行しない限り、作成後に呼び出すには、アロー関数を参照するための変数が必要です。
矢印関数の例:
// 矢印関数を使用すると、`function` キーワードを省略できます。//
ここで、`long_example` は匿名関数の値を指します。const
long_example = ( input1 , input2 ) = > { console . log ( "Hello, World!" ); const output = input1 + input2 ;
出力を返します。};
// 中括弧がない場合、矢印関数は単に式を返します
// したがって、ここでは (input1 + input2) です
const short_example = ( input1 , input2 ) => input1 + input2 ;
long_example ( 2 , 3 ); // "Hello, World!" を出力し、5 を返しますshort_example ( 2 , 5 ); // 7 を返します
// 矢印関数にパラメータが 1 つしかない場合は、括弧を削除できます。const
no_parentheses = input = > input + 2 ;
no_parentheses ( 3 ); // 5 を返す
// 矢印関数は、他の関数定義と同様に、作成時と同じステートメントで実行できます。
// これは、グローバル スコープを埋めないようにライブラリを作成する場合や、クロージャの場合に役立ちます。
let three = (( a , b ) => a + b ) ( 1 , 2 );
const generate_multiplier_function = a => ( b => isNaN ( b ) || ! b ? a : a *= b ); const five_multiples = generate_multiplier_function ( 5 ); // 指定された引数は式の「シード」となり、a によって保持されます。five_multiples ( 1 ); // 5 を返しますfive_multiples ( 3 ); // 15 を返しますfive_multiples ( 4 ); // 60 を返します
JavaScript では、オブジェクトはクラスのインスタンスとして作成できます。
オブジェクトクラスの例:
クラスボール{
コンストラクター(半径) { this.radius = radius ; this.area = Math.PI * ( radius ** 2 ) ; }
// クラス (およびオブジェクト) には、メソッドと呼ばれる関数を含めることができます。
show () { console . log ( this . radius ); } };
const myBall = new Ball ( 5 ); // 半径 5 のボールオブジェクトの新しいインスタンスを作成します。myBall . radius ++ ; // オブジェクトのプロパティは通常、外部から変更できます。myBall . show (); // 継承された "show" 関数を使用すると "6" がログに記録されます。
JavaScript では、関数から オブジェクトを直接インスタンス化できます。
オブジェクトの機能例:
関数ボール(半径) {
const area = Math.PI * (半径** 2 ) ; const obj = {半径、面積} ;
// オブジェクトは変更可能であり、関数をプロパティとして追加できます。
obj . show = () => console . log ( obj . radius ); return obj ; };
const myBall = Ball ( 5 ); // 半径 5 の新しいボール オブジェクトを作成します。「new」キーワードは必要ありません。myBall . radius ++ ; // インスタンス プロパティを変更できます。myBall . show (); // 「show」関数を使用すると、新しいインスタンス値である「6」がログに記録されます。
可変長関数のデモンストレーション(argumentsは特殊変数): [81]
関数sum () { let x = 0 ;
for ( let i = 0 ; i < arguments . length ; ++ i ) x += arguments [ i ];
xを返す; }
sum ( 1 , 2 ); // 3 を返すsum ( 1 , 2 , 3 ); // 6 を返す
// ES6 以降では、rest 演算子を使用します。
function sum (... args ) { return args . Reduce (( a , b ) => a + b ); }
sum ( 1 , 2 ); // 3 を返すsum ( 1 , 2 , 3 ); // 6 を返す
即時に呼び出される関数式は、クロージャを作成するためによく使用されます。クロージャを使用すると、名前空間内のプロパティとメソッドを収集し、その一部をプライベートにすることができます。
let counter = ( function () { let i = 0 ; // プライベートプロパティ
return { // パブリックメソッドget : function () { alert ( i ); }, set : function ( value ) { i = value ; }, increment : function () { alert ( ++ i ); } }; })(); // モジュール
counter.get (); // 0 を返すcounter.set ( 6 ) ; counter.increment ( ) ; // 7 を返すcounter.increment ( ) ; // 8を返す
ジェネレータオブジェクト(ジェネレータ関数の形式)は、内部コンテキスト(状態性)を維持しながら、呼び出し、終了、再入力できる関数を提供します。[82]
関数* rawCounter () { yield 1 ; yield 2 ; }
function * dynamicCounter () { let count = 0 ; while ( true ) { // ほとんどの場合、while true ループの利用は推奨されません。yield ++ count ; } }
// インスタンス
const counter1 = rawCounter (); const counter2 = dynamicCounter ();
// 実装
counter1 . next (); // {値: 1, done: false} counter1 . next (); // {値: 2, done: false} counter1 . next (); // {値: undefined, done: true}
counter2 . next (); // {値: 1, done: false} counter2 . next (); // {値: 2, done: false} counter2 . next (); // {値: 3, done: false} // ...無限に
JavaScriptはモジュールからのエクスポートとインポートが可能です: [83]
エクスポート例:
/* mymodule.js */ // この関数は
エクスポートされていないため、プライベートのままです。let
sum = ( a , b ) => { return a + b ; }
// 変数をエクスポート
export let name = 'Alice' ; export let age = 23 ;
// 名前付き関数をエクスポートする
export function add ( num1 , num2 ) { return num1 + num2 ; }
// エクスポートクラス
export class Multiplication {コンストラクター( num1 、num2 ) { this . num1 = num1 ; this . num2 = num2 ; }
追加(){戻り合計(this.num1 、this.num2 ); } }
インポート例:
// 1つのプロパティをインポートします
import { add } from './mymodule.js' ; console . log ( add ( 1 , 2 )); //> 3
// 複数のプロパティをインポートする
import { name , age } from './mymodule.js' ; console . log ( name , age ); //> "Alice", 23
// モジュールからすべてのプロパティをインポートします
。import * from ' ./module.js ' console.log ( name , age ); // > "Alice", 23 console.log ( add ( 1,2 ) ); //> 3
より高度な例
このサンプル コードは、さまざまな JavaScript 機能を表示します。
/* 2 つの数値の最小公倍数 (LCM) を計算します */
function LCMCalculator ( x , y ) { // コンストラクター関数if ( isNaN ( x * y )) throw new TypeError ( "数値以外の引数は許可されていません。" ); const checkInt = function ( x ) { // 内部関数if ( x % 1 !== 0 ) throw new TypeError ( x + "整数ではありません" );
x を返します。
this . a = checkInt ( x ) // セミコロン ^^^^ はオプションで、改行で十分ですthis . b = checkInt ( y ); } // コンストラクターによって作成されたオブジェクト インスタンスのプロトタイプは、// そのコンストラクターの「プロトタイプ」プロパティです。LCMCalculator . prototype = { // オブジェクト リテラルコンストラクター: LCMCalculator 、// プロトタイプを再割り当てする場合は、コンストラクター プロパティを適切に設定しますgcd : function () { // 最大公約数を計算するメソッド// ユークリッドのアルゴリズム: let a = Math . abs ( this . a ), b = Math . abs ( this . b ), t ;
if ( a < b ) { // 変数を交換// t = b; b = a; a = t; [ a , b ] = [ b , a ]; // 分割代入を使用して交換 (ES6) }
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 () { return a ; };
を返す; },
// オブジェクト プロパティ名は、二重引用符 (") または一重引用符 (') で区切られた文字列で指定できます。
"lcm" : function () { // 変数名はオブジェクト プロパティと衝突しません。たとえば、|lcm| は |this.lcm| ではありません。 // FP 精度の問題を回避するために |this.a*this.b| は使用しません。let lcm = this . a / this . gcd () * this . b ;
// lcm を一度だけ計算する必要があるので、このメソッドを「再定義」します。
this . lcm = function () { return lcm ; };
lcmを返す; },
// メソッドは ES6 構文を使用して宣言することもできます
toString () { // ES6 テンプレートリテラルと (+) 演算子の両方を使用して値を連結しますreturn `LCMCalculator: a = ${ this . a } , b = ` + this . b ; } };
// 汎用出力関数を定義します。この実装は Web ブラウザーでのみ機能します。
function output ( x ) { document . body . appendChild ( document . createTextNode ( x )); document . body . appendChild ( document . createElement ( 'br' )); }
// 注: 配列の map() と forEach() は JavaScript 1.6 で定義されています。
// ここでは、JavaScript の本来の機能的な性質を示すために使用されています。
[
[ 25 , 55 ], [ 21 , 56 ], [ 22 , 58 ], [ 28 , 56 ] ]. map ( function ( pair ) { // 配列リテラル + マッピング関数return new LCMCalculator ( pair [ 0 ], pair [ 1 ]); }). sort (( a , b ) => a . lcm () - b . lcm ()) // この比較関数でソートします。 => は、"矢印関数" と呼ばれる関数の省略形です。 . forEach ( printResult );
関数printResult ( obj ) {出力( obj + ", gcd = " + obj . gcd () + ", lcm = " + obj . lcm ()); }
次の出力がブラウザ ウィンドウに表示されます。
LCM 計算: a = 28、b = 56、gcd = 28、lcm = 56
LCM 計算: a = 21、b = 56、gcd = 7、lcm = 168
LCM 計算: a = 25、b = 55、gcd = 5、lcm = 275
LCM 計算: a = 22、b = 58、gcd = 2、lcm = 638
安全
JavaScript とDOM には、悪意のある作成者が Web 経由でクライアント コンピューターで実行するスクリプトを配信する可能性があるという問題があります。ブラウザーの作成者は、2 つの制限を使用してこのリスクを最小限に抑えています。まず、スクリプトはサンドボックス内で実行されます。サンドボックス内では、ファイルの作成などの汎用プログラミング タスクではなく、Web 関連のアクションのみを実行できます。次に、スクリプトは同一生成元ポリシーによって制約されます。つまり、ある Web サイトのスクリプトは、別のサイトに送信されたユーザー名、パスワード、Cookie などの情報にアクセスできません。JavaScript 関連のセキュリティ バグのほとんどは、同一生成元ポリシーまたはサンドボックスの違反です。
一般的なJavaScriptのサブセットであるADsafe、Secure ECMAScript (SES)は、特に第三者が作成したコード(広告など)に対してより高いレベルのセキュリティを提供します。[84] [85] Closure Toolkitは、サードパーティのJavaScriptとHTMLを安全に埋め込み、分離するための別のプロジェクトです。[86]
コンテンツ セキュリティ ポリシーは、Web ページ上で信頼できるコードのみが実行されるようにするための主な方法です。
クロスサイトスクリプティング
JavaScript 関連の一般的なセキュリティ問題に、同一生成元ポリシーに違反するクロスサイト スクリプティング(XSS)があります。XSS の脆弱性は、攻撃者がオンライン バンキングの Web サイトなどのターゲット Web サイトで、被害者に表示される Web ページに悪意のあるスクリプトを組み込む場合に発生します。この例のスクリプトは、被害者の権限でバンキング アプリケーションにアクセスできるため、秘密情報を漏洩したり、被害者の許可なく送金したりする可能性があります。XSS の脆弱性に対する重要な解決策の 1 つは、HTML のサニタイズです。
一部のブラウザには、攻撃者が悪意のあるスクリプトを含む URL を提供するリフレクションXSS 攻撃に対する部分的な保護が含まれています。ただし、これらのブラウザのユーザーであっても、悪意のあるコードがデータベースに保存される攻撃など、他の XSS 攻撃に対しては脆弱です。サーバー側で Web アプリケーションを正しく設計することによってのみ、XSS を完全に防止できます。
XSS脆弱性はブラウザ作成者の実装ミスによっても発生する可能性がある。[87]
クロスサイトリクエストフォージェリ
クロスサイト脆弱性のもう 1 つは、クロスサイト リクエスト フォージェリ(CSRF) です。CSRF では、攻撃者のサイト上のコードが被害者のブラウザーをだまして、ターゲット サイトでユーザーが意図していないアクション (銀行での送金など) を実行させます。ターゲット サイトがリクエストの認証に Cookie のみに依存している場合、攻撃者のサイト上のコードから発信されたリクエストには、開始ユーザーと同じ有効なログイン資格情報が含まれる可能性があります。一般に、CSRF の解決策は、永続的な影響を与える可能性のあるリクエストを認証するために、Cookie だけでなく、隠しフォーム フィールドにも認証値を要求することです。HTTP リファラー ヘッダーをチェックすることも役立ちます。
<script>「JavaScript ハイジャック」は、攻撃者のサイト上のタグが被害者のサイト上のページを悪用してJSONや JavaScript などの個人情報を返すCSRF 攻撃の一種です。考えられる解決策は次のとおりです。
クライアントに対する誤った信頼
クライアント サーバー アプリケーションの開発者は、信頼できないクライアントが攻撃者の制御下にある可能性があることを認識する必要があります。アプリケーションの作成者は、JavaScript コードが意図したとおりに実行される (またはまったく実行される) と想定することはできません。コードに埋め込まれた秘密は、攻撃者によって抽出される可能性があるためです。次のような影響があります。
- ウェブサイトの作成者は、生のソース コードをクライアントに送信する必要があるため、JavaScript の動作を完全に隠蔽することはできません。コードは難読化できますが、難読化はリバース エンジニアリングされる可能性があります。
- JavaScript フォーム検証は、セキュリティではなく、ユーザーの利便性のみを提供します。サイトが、ユーザーが利用規約に同意したかどうかを確認したり、数字のみを含むフィールドから無効な文字をフィルター処理したりする場合は、クライアントだけでなくサーバーでも実行する必要があります。
- スクリプトは選択的に無効にすることができるため、画像を右クリックして保存するなどの操作をJavaScriptに頼って防ぐことはできません。[88]
- パスワードなどの機密情報をJavaScriptに埋め込むことは、攻撃者によって抽出される可能性があるため、非常に悪い習慣と考えられています。[89]
- プロトタイプ汚染は、攻撃者がオブジェクトのプロトタイプ内の任意のプロパティを上書きできる実行時の脆弱性です。
開発者への誤った信頼
npmや Bowerなどのパッケージ管理システムは、JavaScript 開発者の間で人気があります。このようなシステムにより、開発者は自分のプログラムが他の開発者のプログラム ライブラリに依存しているかどうかを簡単に管理できます。開発者は、ライブラリの保守担当者がライブラリを安全かつ最新の状態に維持してくれると信頼していますが、必ずしもそうとは限りません。この盲目的な信頼が原因で脆弱性が生まれています。依存しているライブラリが新しいリリースをリリースすると、そのライブラリに依存するすべてのプログラムにバグや脆弱性が現れる可能性があります。逆に、ライブラリがパッチを当てられず、既知の脆弱性がそのまま放置されることもあります。133,000 の Web サイトのサンプルを調査した調査では、研究者は、Web サイトの 37% に少なくとも 1 つの既知の脆弱性を持つライブラリが含まれていることを発見しました。[90]「各 Web サイトで使用されている最も古いライブラリ バージョンとそのライブラリの最新バージョンとの間の平均遅延は、ALEXA では 1,177 日で、現在もアクティブに使用されているライブラリの中には、何年も前に開発が中止されているものもあります。」[90]もう 1 つの可能性は、ライブラリの保守担当者がライブラリを完全に削除することです。これは2016年3月にAzer Koçuluがnpmからリポジトリを削除したときに発生しました。これにより、彼のライブラリに依存している数万のプログラムとWebサイトが機能しなくなりました。[91] [92]
ブラウザとプラグインのコーディングエラー
JavaScript は、さまざまなブラウザ機能へのインターフェイスを提供しますが、その一部にはバッファ オーバーフローなどの欠陥がある可能性があります。これらの欠陥により、攻撃者はユーザーのシステムで任意のコードを実行するスクリプトを作成できます。このコードは、他の JavaScript アプリケーションに限定されるものではありません。たとえば、バッファ オーバーランの脆弱性により、攻撃者はスーパーユーザー権限でオペレーティング システムのAPIにアクセスできます。
これらの欠陥はFirefox、 [93]、 Internet Explorer、[94] 、Safari [95]などの主要なブラウザに影響を与えています。
ビデオプレーヤー、Adobe Flash、Microsoft Internet Explorerでデフォルトで有効になっているさまざまなActiveXコントロールなどのプラグインにも、JavaScriptを介して悪用される可能性のある欠陥がある可能性があります(このような欠陥は過去に悪用されています)。[96] [97]
Windows Vistaでは、マイクロソフトは、Internet Explorerのプロセスを制限された権限で実行することで、バッファオーバーフローなどのバグのリスクを抑制しようとしました。[98] Google Chromeも同様に、ページレンダラーを独自の「サンドボックス」内に制限しています。
サンドボックス実装エラー
Web ブラウザは、ファイルの作成や削除などに必要な権限を持ち、サンドボックス外で JavaScript を実行できます。このような権限は、Web のコードに付与されることを意図したものではありません。
WebからJavaScriptに誤って権限を付与することが、Internet Explorer [99]とFirefox [100]の両方の脆弱性の一因となっています。Windows XP Service Pack 2では、MicrosoftはInternet ExplorerでのJScriptの権限を降格しました。[101]
Microsoft Windowsでは、コンピュータのハードドライブ上のJavaScriptソースファイルを、汎用の非サンドボックスプログラムとして起動することができます(Windows Script Hostを参照)。これにより、JavaScript( VBScriptなど)は理論的にはトロイの木馬のベクターとして実行可能ですが、実際にはJavaScriptトロイの木馬はまれです。[102] [検証失敗]
ハードウェアの脆弱性
2015年には、セキュリティ研究者による論文で、JavaScriptベースのRowhammer攻撃の概念実証の実装が説明されました。 [103] [104] [105] [106]
2017年には、ブラウザを介したJavaScriptベースの攻撃がASLRを回避できることが実証されました。これは「ASLR⊕Cache」またはAnCと呼ばれています。[107] [108]
2018年に、 Intelや他のプロセッサの投機的実行に対するSpectre攻撃を発表した論文にはJavaScriptの実装が含まれていました。 [109]
開発ツール
重要なツールは言語とともに進化してきました。
- すべての主要な Web ブラウザには、JavaScriptデバッガーを含むWeb 開発ツールが組み込まれています。
- ESLintやJSLintなどの静的プログラム分析ツールは、JavaScript コードをスキャンして、一連の標準とガイドラインに準拠しているかどうかを確認します。
- 一部のブラウザにはプロファイラが組み込まれている。また、benchmark.jsやjsbenchなどのスタンドアロンのプロファイリングライブラリも作成されている。[110] [111]
- 多くのテキスト エディターには、JavaScript コードの構文強調表示のサポートがあります。
関連技術
ジャワ
よくある誤解は、JavaScript がJavaと直接関連しているというものです。確かにどちらも C のような構文を持っています (C 言語は両者の最も近い共通の祖先言語です)。また、これらは通常サンドボックス化されており、JavaScript は Java の構文と標準ライブラリを念頭に置いて設計されています。特に、すべての Java キーワードは元の JavaScript で予約されており、JavaScript の標準ライブラリは Java の命名規則に従っており、JavaScript のMathおよびDateオブジェクトは Java 1.0 のクラスに基づいています。[112]
どちらの言語も 1995 年に初めて登場しましたが、Java はSun Microsystems のJames Gosling氏によって開発され、JavaScript はNetscape Communications の Brendan Eich氏によって開発されました。
2 つの言語の違いは類似点よりも顕著です。Java は静的型付けですが、JavaScript の型付けは動的です。Java はコンパイルされたバイトコードからロードされますが、JavaScript は人間が読めるソースコードとしてロードされます。Java のオブジェクトはクラスベースですが、JavaScriptのオブジェクトはプロトタイプベースです。最後に、Java は Java 8 まで関数型プログラミングをサポートしませんでしたが、JavaScript はSchemeの影響を受け、最初から関数型プログラミングをサポートしていました。
翻訳
JSON はJavaScript から派生したデータ形式であるため、JavaScript Object Notation という名前が付けられています。これは、他の多くのプログラミング言語でサポートされている、広く使用されている形式です。
トランスパイラ
多くのウェブサイトはJavaScriptを多用しているため、他の言語で書かれたコードを変換して開発プロセスを支援するトランスパイラが作成されています。 [36]
TypeScriptとCoffeeScript は、 JavaScript にトランスパイルされる 2 つの有名な言語です。
Webアセンブリ
WebAssemblyは、JavaScript、特にWebページスクリプトのパフォーマンスが重要な部分を補完するように設計されたバイトコード形式を持つ新しい言語です。すべての主要なJavaScriptエンジンはWebAssemblyをサポートしており、[113]通常のJavaScriptコードと同じサンドボックスで実行されます。
asm.jsはWebAssemblyの前身となったJavaScriptのサブセットです。[114]
参考文献
- ^ ab 「Netscape と Sun が、企業ネットワークとインターネット向けのオープンなクロスプラットフォーム オブジェクト スクリプト言語 JavaScript を発表」(プレス リリース)。1995 年 12 月 4 日。2007 年 9 月 16 日時点のオリジナルよりアーカイブ。
- ^ 「ECMAScript® 2024 言語仕様」。2024 年 6 月。2024 年8 月 30 日閲覧。
- ^ 「ECMAScript® 2025 言語仕様」。2024年3月27日。 2024年4月17日閲覧。
- ^ “nodejs/node-eps”. GitHub . 2020年8月29日時点のオリジナルよりアーカイブ。2018年7月5日閲覧。
- ^ ab セイベル、ピーター(2009年9月16日)。仕事中のコーダー:プログラミングの技術についての考察。Apress。ISBN 9781430219484. 2020年12月24日時点のオリジナルよりアーカイブ。2018年12月25日閲覧。
Eich: Netscape が当面懸念したのは、Java のように見える必要があるということでした。
- ^ abcde 「第4章 JavaScriptがどのように作成されたか」。speakingjs.com。 2020年2月27日時点のオリジナルよりアーカイブ。2017年11月21日閲覧。
- ^ “人気 – ブレンダン・アイヒ”.
- ^ 「Brendan Eich: JavaScript 入門、JSConf 2010」。YouTube 。 2013年1月20日。22分。2020年8月29日時点のオリジナルよりアーカイブ。 2019年11月25日閲覧。Eich
:「function」、8文字、AWKに影響を受けました。
- ^ Eich, Brendan (1998)。「序文」。Goodman , Danny (編)。JavaScript Bible (第 3 版)。John Wiley & Sons。ISBN 0-7645-3188-3. LCCN 97078208. OCLC 38888873. OL 712205M.
- ^ ab 「ウェブサイトにおけるクライアント側プログラミング言語としての JavaScript の使用統計」。W3Techs。2024年2 月 27 日閲覧。
- ^ “ECMAScript 2020 言語仕様”. 2020年5月8日時点のオリジナルよりアーカイブ。2020年5月8日閲覧。
- ^ 「ブルームバーグのゲームチェンジャー:マーク・アンドリーセン」。ブルームバーグ。ブルームバーグ。2011年3月17日。2012年5月16日時点のオリジナルよりアーカイブ。 2011年12月7日閲覧。
- ^ Enzer, Larry (2018年8月31日). 「Webブラウザの進化」Monmouth Web Developers。 2018年8月31日時点のオリジナルよりアーカイブ。 2018年8月31日閲覧。
- ^ abc Fin JS (2016年6月17日)、「ブレンダン・アイク – BraveのCEO」、YouTube 、 2018年2月7日閲覧
- ^ 「Netscape Communications Corp.」、ブラウザ拡張機能。Encyclopædia Britannica 2006 Ultimate Reference Suite DVD
- ^ 「TechVision: ネットの革新者: Brendan Eich と JavaScript」。2008 年 2 月 8 日時点のオリジナルよりアーカイブ。
- ^ ab Han, Sheon (2024年3月4日). 「JavaScriptが世界を動かす—文字通りかもしれない」. Wired . 2024年8月21日閲覧。
- ^ ab “第5章 標準化: ECMAScript”。speakingjs.com。 2021年11月1日時点のオリジナルよりアーカイブ。2021年11月1日閲覧。
- ^ ab Champeon, Steve (2001年4月6日). 「JavaScript、どうやってここまで来たのか?」oreilly.com . 2016年7月19日時点のオリジナルよりアーカイブ。2016年7月16日閲覧。
- ^ 「Microsoft Internet Explorer 3.0 Beta Now Available」. microsoft.com . Microsoft. 1996年5月29日. 2020年11月24日時点のオリジナルよりアーカイブ。 2016年7月16日閲覧。
- ^ McCracken, Harry (2010年9月16日). 「「Internet Explorerで閲覧するのが最適です」の歓迎されない復活」. technologizer.com . 2018年6月23日時点のオリジナルよりアーカイブ。 2016年7月16日閲覧。
- ^ Baker, Loren (2004年11月24日). 「Mozilla Firefoxインターネットブラウザの市場シェアが7.4%に増加」。Search Engine Journal。2021年5月7日時点のオリジナルよりアーカイブ。 2021年5月8日閲覧。
- ^ Weber, Tim (2005年5月9日). 「ソフトウェア大手マイクロソフトへの攻撃」BBCニュース2017年9月25日時点のオリジナルよりアーカイブ。
- ^ 「大規模ブラウザ比較テスト: Internet Explorer vs. Firefox、Opera、Safari、Chrome」。PCゲーム ハードウェア。Computec Media AG。2009 年 7 月 3 日。2012 年 5 月 2 日時点のオリジナルよりアーカイブ。2010年6 月 28 日閲覧。
- ^ Purdy, Kevin (2009年6月11日). 「Lifehacker Speed Tests: Safari 4, Chrome 2」. Lifehacker . 2021年4月14日時点のオリジナルよりアーカイブ。 2021年5月8日閲覧。
- ^ 「TraceMonkey: JavaScript Lightspeed、Brendan Eich のブログ」。2015 年 12 月 4 日時点のオリジナルよりアーカイブ。2020 年7 月 22 日閲覧。
- ^ 「Mozilla が『我々はもう速いのか?』と問う」Wired。2018年6月22日時点のオリジナルよりアーカイブ。2019年1月18日閲覧。
- ^ 「ECMAScript 6: 新機能: 概要と比較」。es6-features.org。2018年3月18日時点のオリジナルよりアーカイブ。2018年3月19日閲覧。
- ^ Professional Node.js: JavaScript ベースのスケーラブルなソフトウェアの構築 Archived 2017-03-24 at the Wayback Machine、John Wiley & Sons、2012 年 10 月 1 日
- ^ Sams Teach Yourself Node.js in 24 Hours Archived 2017-03-23 at the Wayback Machine、Sams Publishing、2012 年 9 月 5 日
- ^ Lawton, George (2018年7月19日). 「npmとNodeの成功の裏にある秘密の歴史」TheServerSide . 2021年8月2日時点のオリジナルよりアーカイブ。2021年8月2日閲覧。
- ^ Brown, Paul (2017年1月13日). 「State of the Union: npm」. Linux.com . 2021年8月2日時点のオリジナルよりアーカイブ。2021年8月2日閲覧。
- ^ abc Branscombe, Mary (2016年5月4日). 「JavaScript Standard Moves to Yearly Release Schedule; Here is What's New for ES16」. The New Stack . 2021年1月16日時点のオリジナルよりアーカイブ。 2021年1月15日閲覧。
- ^ 「TC39プロセス」。tc39.es。Ecma International。2021年2月7日時点のオリジナルよりアーカイブ。2021年1月15日閲覧。
- ^ “ECMAScript proposals”. TC39. 2020年12月4日時点のオリジナルよりアーカイブ。 2021年1月15日閲覧。
- ^ ab Ashkenas, Jeremy . 「JS にコンパイルされる言語のリスト」。GitHub . 2020 年 1 月 31 日時点のオリジナルよりアーカイブ。2020年2 月 6 日閲覧。
- ^ 「US Trademark Serial No. 75026640」。uspto.gov。米国特許商標庁。1997年5月6日。2021年7月13日時点のオリジナルよりアーカイブ。2021年5月8日閲覧。
- ^ 「法的通知」。ora cle.com。Oracle Corporation 。 2021年6月5日時点のオリジナルよりアーカイブ。2021年5月8日閲覧。
- ^ 「Oracleが74億ドルでSunを買収へ」The Economic Times 2009年4月21日。
- ^ abc 「ウェブサイト向け JavaScript ライブラリの使用統計」W3Techs . 2021 年4 月 9 日閲覧。
- ^ 「Bootstrap で jQuery を使用する」。clouddevs.com。2019年 6 月 10 日。2024 年3 月 17 日閲覧。
- ^ “Vanilla JS”. vanilla-js.com . 2020年6月16日. 2020年6月16日時点のオリジナルよりアーカイブ。 2020年6月17日閲覧。
- ^ 「Server-Side JavaScript Guide」. oracle.com . Oracle Corporation . 1998年12月11日. 2021年3月11日時点のオリジナルよりアーカイブ。 2021年5月8日閲覧。
- ^ Clinick, Andrew (2000 年 7 月 14 日)。「JScript .NET の紹介」。Microsoft Developer Network。Microsoft。2017年 11 月 10 日時点のオリジナルからのアーカイブ。2018年4 月 10 日閲覧。1996
年に JScript バージョン 1.0 が導入されて以来、サーバーでの JScript の使用は着実に増加しています。特に Active Server Pages (ASP) で増加しています。
- ^ ab Mahemoff, Michael (2009年12月17日). 「Server-Side JavaScript, Back with a Vengeance」. readwrite.com . 2016年6月17日時点のオリジナルよりアーカイブ。 2016年7月16日閲覧。
- ^ 「JavaScript for Acrobat」。adobe.com。2009年8月7日。2009年8月7日時点のオリジナルよりアーカイブ。2009年8月18日閲覧。
- ^ treitter (2013 年 2 月 2 日). 「質問への回答: 「GNOME 用アプリの開発方法は?」」livejournal.com。 2013 年 2 月 11 日時点のオリジナルよりアーカイブ。2013 年2 月 7 日閲覧。
- ^ 「Tessel 2... Node.JS のすべてのライブラリを活用して、Tessel で数分で便利なデバイスを作成します」。tessel.io。2021 年 5 月 26 日時点のオリジナルよりアーカイブ。2021 年5 月 8 日閲覧。
- ^ 「Node.js Raspberry Pi GPIO 入門」。w3schools.com。2021年8月13日時点のオリジナルよりアーカイブ。2020年5月3日閲覧。
- ^ 「Espruino – マイクロコントローラ向け JavaScript」。espruino.com。2020年5月1日時点のオリジナルよりアーカイブ。2020年5月3日閲覧。
- ^ Looper, Jen (2015年9月21日). 「初心者のためのJavaScriptエンジンガイド」. Telerik Developer Network. 2018年12月8日時点のオリジナルよりアーカイブ。2018年12月8日閲覧。
- ^ 「Blinkの仕組み」Google . 2024年3月12日閲覧。
- ^ ab “Documentation · V8”. Google . 2024年3月3日閲覧。
- ^ Nelaturu, Keerthi. 「WebAssembly: 何が重要なのか?」. medium.com . 2024 年3 月 3 日閲覧。
- ^ 「並行性モデルとイベントループ」。Mozilla Developer Network。2015年9月5日時点のオリジナルよりアーカイブ。2015年8月28日閲覧。
- ^ Flanagan, David ( 2006年 8 月 17 日)。JavaScript: 決定版ガイド: 決定版ガイド。「O'Reilly Media, Inc.」。p. 16。ISBN 978-0-596-55447-7. 2020年8月1日時点のオリジナルよりアーカイブ。2019年3月29日閲覧。
- ^ abcd Korolev, Mikhail (2019年3月1日). 「インターネット上の1枚の画像に見られるJavaScriptの癖」. The DEV Community . 2019年10月28日時点のオリジナルよりアーカイブ。 2019年10月28日閲覧。
- ^ Bernhardt, Gary (2012). 「Wat」. Destroy All Software . 2019年10月28日時点のオリジナルよりアーカイブ。 2019年10月28日閲覧。
- ^ 「JavaScript のデータ型とデータ構造」。MDN。2017年2月16日。2017年3月14日時点のオリジナルよりアーカイブ。2017年2月24日閲覧。
- ^ フラナガン2006年、176-178頁。
- ^ Crockford, Douglas. 「JavaScript におけるプロトタイプ継承」。2013 年 8 月 13 日時点のオリジナルよりアーカイブ。2013年8 月 20 日閲覧。
- ^ 「継承とプロトタイプチェーン」。Mozilla Developer Network。2013年4月25日時点のオリジナルよりアーカイブ。2013年4月6日閲覧。
- ^ ハーマン、デイビッド (2013)。効果的な JavaScript。アディソン・ウェズリー。p. 83。ISBN 978-0-321-81218-6。
- ^ ハフェルベケ、マリジン (2011).雄弁な JavaScript。スターチプレスは不要です。 95–97ページ。ISBN 978-1-59327-282-1。
- ^ Katz, Yehuda (2011 年 8 月 12 日). 「JavaScript の「プロトタイプ」を理解する」。2013 年 4 月 5 日時点のオリジナルよりアーカイブ。2013年4 月 6 日閲覧。
- ^ ハーマン、デイビッド (2013)。効果的な JavaScript。アディソン・ウェズリー。pp. 125–127。ISBN 978-0-321-81218-6。
- ^ 「Function – JavaScript」。MDN Web Docs 。 2021年10月30日閲覧。
- ^ 「関数オブジェクトのプロパティ」。Es5.github.com。2013年1月28日時点のオリジナルよりアーカイブ。2013年5月26日閲覧。
- ^ フラナガン2006年、141ページ。
- ^ トレイトやミックスインのようなロール指向プログラミングのアプローチを一般化する JavaScript の多くの才能 Archived 2017-10-05 at the Wayback Machine、Peterseliger.blogpsot.de、2014 年 4 月 11 日。
- ^ Traits for JavaScript、Wayback Machineで2010 年 7 月 24 日にアーカイブ。
- ^ “Home | CocktailJS”. Cocktailjs.github.io . 2017年2月4日時点のオリジナルよりアーカイブ。2017年2月24日閲覧。
- ^ Croll, Angus (2011年5月31日). 「JavaScript Mixinsの新たな見方」. JavaScript、JavaScript… . 2020年4月15日時点のオリジナルよりアーカイブ。
- ^ ハフェルベケ、マリジン (2011).雄弁な JavaScript。スターチプレスは不要です。 139~149ページ。ISBN 978-1-59327-282-1。
- ^ 「E4X – 廃止コンテンツのアーカイブ」。Mozilla Developer Network。Mozilla Foundation。2014年2月14日。2014年7月24日時点のオリジナルよりアーカイブ。2014年7月13日閲覧。
- ^ "var – JavaScript". The Mozilla Developer Network . 2012年12月23日時点のオリジナルよりアーカイブ。 2012年12月22日閲覧。
- ^ "let". MDN Web ドキュメント. Mozilla. 2019年5月28日時点のオリジナルよりアーカイブ。2018年6月27日閲覧。
- ^ "const". MDN Web ドキュメント. Mozilla. 2018 年 6 月 28 日時点のオリジナルよりアーカイブ。2018 年6 月 27 日閲覧。
- ^ 「ECMAScript 言語仕様 – ECMA-262 エディション 5.1」。Ecma International。2012年 11 月 26 日時点のオリジナルよりアーカイブ。2012 年12 月 22 日閲覧。
- ^ "console". Mozilla Developer Network . Mozilla . 2013年2月28日時点のオリジナルよりアーカイブ。2013年4月6日閲覧。
- ^ "arguments". Mozilla Developer Network . Mozilla . 2013年4月13日時点のオリジナルよりアーカイブ。2013年4月6日閲覧。
- ^ “function* - JavaScript | MDN”. developer.mozilla.org . 2022年9月27日閲覧。
- ^ 「JavaScript モジュール」。MDN Web Docs。Mozilla。2022年7月17日時点のオリジナルよりアーカイブ。2022年7月28日閲覧。
- ^ “Making JavaScript Safe for Advertising”. ADsafe. 2021年7月6日時点のオリジナルよりアーカイブ。 2021年5月8日閲覧。
- ^ 「Secure ECMA Script (SES)」。2013年5月15日時点のオリジナルよりアーカイブ。 2013年5月26日閲覧。
- ^ “Google Caja Project”. Google . 2021年1月22日時点のオリジナルよりアーカイブ。2021年7月9日閲覧。
- ^ 「Mozilla クロスサイトスクリプティング脆弱性が報告され、修正されました – MozillaZine Talkback」。Mozillazine.org 。 2011年7月21日時点のオリジナルよりアーカイブ。2017年2月24日閲覧。
- ^ Kottelin, Thor (2008年6月17日). 「右クリックの「保護」?忘れてください」。blog.anta.net。2011年8月9日時点のオリジナルよりアーカイブ。 2022年7月28日閲覧。
- ^ Rehorik, Jan (2016 年 11 月 29 日). 「JavaScript に機密データを入れてはいけない理由」. ServiceObjects ブログ. ServiceObjects. 2019 年 6 月 3 日時点のオリジナルよりアーカイブ。2019年6 月 3 日閲覧。
- ^ ab Lauinger, Tobias; Chaabane, Abdelberi; Arshad, Sajjad; Robertson, William; Wilson, Christo; Kirda, Engin (2016 年 12 月 21 日)、「Thou Shalt Not Depend on Me: Analysing the Use of Outdated JavaScript Libraries on the Web」(PDF)、ノースイースタン大学、arXiv : 1811.00918、doi :10.14722/ndss.2017.23414、ISBN 978-1-891562-46-4、S2CID 17885720、 2017年3月29日時点の オリジナル(PDF)からアーカイブ、2022年7月28日閲覧
- ^ コリンズ、キース(2016年3月27日)。「1人のプログラマーが小さなコードを削除してインターネットを破壊した方法」Quartz。2017年2月22日時点のオリジナルよりアーカイブ。 2017年2月22日閲覧。
- ^ SC Magazine UK、開発者の11行の削除されたコードが「インターネットを壊す」 2017年2月23日アーカイブ、Wayback Machine
- ^ Mozilla Corporation、crypto.signText() のバッファオーバーフロー、2014-06-04 にWayback Machineでアーカイブ
- ^ Festa, Paul (1998 年 8 月 19 日). 「IE のバッファオーバーフローバグ」. CNET . 2002 年 12 月 25 日時点のオリジナルよりアーカイブ。
- ^ SecurityTracker.com、Apple Safari の JavaScript バッファオーバーフローによりリモートユーザーが任意のコードを実行可能、HTTP リダイレクトバグによりリモートユーザーがファイルにアクセスできる、2010-02-18 にWayback Machineでアーカイブ
- ^ SecurityFocus、Microsoft WebViewFolderIcon ActiveX コントロールのバッファ オーバーフロー脆弱性、Wayback Machineで 2011-10-11 にアーカイブ
- ^ Fusion Authority、Macromedia Flash ActiveX バッファオーバーフロー、2011年8月13日アーカイブ、Wayback Machine
- ^ 「Vista IE7 の保護モード – IEBlog」。Blogs.msdn.com。2006年 2 月 9 日。2010 年 1 月 23 日時点のオリジナルよりアーカイブ。2017年2 月 24 日閲覧。
- ^ US CERT、脆弱性ノート VU#713878: Microsoft Internet Explorer はリダイレクトされたフレームのソースを適切に検証しません。2009 年 10 月 30 日にWayback Machineにアーカイブされました。
- ^ Mozilla Foundation、Mozilla Foundation セキュリティアドバイザリ 2005–41: DOM プロパティのオーバーライドによる権限昇格 Archived 2014-06-04 at the Wayback Machine
- ^ Andersen, Starr (2004 年 8 月 9 日)。「パート 5: 強化されたブラウジング セキュリティ」。TechNet。Microsoft Docs。Windows XP Service Pack 2 での機能の変更。2021年10 月 20 日に取得。
- ^ 珍しい JavaScript トロイの木馬の例については、Symantec Corporation、JS.Seeker.K (2011-09-13 にWayback Machineでアーカイブ) を参照してください。
- ^ Gruss, Daniel; Maurice, Clémentine; Mangard, Stefan (2015 年 7 月 24 日)。「Rowhammer.js: JavaScript におけるリモート ソフトウェア誘発フォールト攻撃」。arXiv : 1507.06955 [ cs.CR ]。
- ^ Jean-Pharuns, Alix (2015年7月30日). 「Rowhammer.jsは私が今まで見た中で最も独創的なハックです」. Motherboard . Vice . 2018年1月27日時点のオリジナルよりアーカイブ。 2018年1月26日閲覧。
- ^ Goodin, Dan (2015年8月4日). 「DRAM の「ビットフリッピング」エクスプロイトによるPC攻撃:JavaScriptを追加するだけ」Ars Technica . 2018年1月27日時点のオリジナルよりアーカイブ。 2018年1月26日閲覧。
- ^ Auerbach, David (2015 年 7 月 28 日). 「Rowhammer セキュリティ エクスプロイト: 新しいセキュリティ攻撃が本当に恐ろしい理由」. slate.com . 2015 年 7 月 30 日時点のオリジナルよりアーカイブ。2015 年7 月 29 日閲覧。
- ^ AnC 2017-03-16にWayback MachineでアーカイブVUSec、2017
- ^ 新しい ASLR 破壊 JavaScript により、ドライブバイ攻撃がさらに悪質になる予定。2017 年 3 月 16 日、Wayback Machineにアーカイブ。Ars Technica、2017 年
- ^ スペクター攻撃 アーカイブ 2018-01-03 at the Wayback Machineスペクター攻撃
- ^ "Benchmark.js". benchmarkjs.com . 2016年12月19日時点のオリジナルよりアーカイブ。2016年11月6日閲覧。
- ^ JSBEN.CH. 「JSBEN.CH Performance Benchmarking Playground for JavaScript」. jsben.ch . 2021年2月27日時点のオリジナルよりアーカイブ。2021年8月13日閲覧。
- ^ Eich, Brendan (2008年4月3日). 「Popularity」. 2011年7月3日時点のオリジナルよりアーカイブ。2012年1月19日閲覧。
- ^ 「Edge ブラウザーが WebAssembly を「オン」に切り替える -- Visual Studio Magazine」。Visual Studio Magazine。2018年 2 月 10 日時点のオリジナルよりアーカイブ。2018年2 月 9 日閲覧。
- ^ 「よくある質問」. asm.js. 2014年6月4日時点のオリジナルよりアーカイブ。2014年4月13日閲覧。
出典
- Dere, Mohan (2017 年 12 月 21 日)。「素晴らしいアプリを作るために必要なすべてのライブラリを create-react-app と統合する方法」。freeCodeCamp。2018年6 月 14 日閲覧。
- パンチャル、クルナル(2022年4月26日)。 「Angular と React の詳細な比較」。グルーヴィーなウェブ。2023 年6 月 5 日に取得。
さらに読む
- Flanagan, David. JavaScript: The Definitive Guide . 第 7 版。カリフォルニア州セバストポル: O'Reilly、2020 年。ISBN 978-1-491-95202-3。
- ハフェルベケ、マリジン。雄弁な JavaScript。第3版。ノースターチプレス、2018年。472ページ。ISBN 978-1593279509。(ダウンロード)
- Zakas, Nicholas.オブジェクト指向 JavaScript の原則、第 1 版。No Starch Press、2014 年。120 ページ。ISBN 978-1593275402。
外部リンク
- 最新の JavaScript チュートリアル。コミュニティによって、言語全体に関するチュートリアルのコレクションが継続的に更新されています。
- 「JavaScript: 最初の20年」。2022年2月6日閲覧。
